تصبح NSString المشفرة غير صالحة ، وبقايا NSString "العادية"
سؤال
أنا أواجه مشكلة في سلسلة تحتوي على أحرف مشفرة. على وجه التحديد ، إذا كانت السلسلة تحتوي على أحرف مشفرة ، فإنها تصبح في النهاية غير صالحة بينما لن تكون السلسلة "العادية".
في ملف .h:
@interface DirViewController : TTThumbsViewController
<UIActionSheetDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate>
{
NSString *sourceFolder;
NSString *encodedSourceFolder;
}
@property (nonatomic, retain) NSString *sourceFolder;
@property (nonatomic, retain) NSString *encodedSourceFolder;
في ملف .M:
- (id)initWithFolder:(NSString*)folder query:(NSDictionary*)query {
if (self = [super init]) {
sourceFolder = folder;
}
return self;
}
حتى الآن يبدو أن كل شيء يعمل كما هو متوقع. في ViewDidload لدي ما يلي:
sourceFolderCopy = [self urlEncodeValue:(sourceFolder)];
//I also have this button, which I'll refer to later:
UIBarButtonItem *importButton = [[UIBarButtonItem alloc] initWithTitle:@"Import/Export" style:UIBarButtonItemStyleBordered
target:self
action:@selector(importFiles:)];
self.navigationItem.rightBarButtonItem = importButton;
التي تستخدم الطريقة التالية لتشفير السلسلة (إذا كانت تحتوي على أحرف أريد ترميزها):
- (NSString *)urlEncodeValue:(NSString *)str {
NSString *result = (NSString *) CFURLCreateStringByAddingPercentEscapes (kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
return [result autorelease];
}
إذا كنت نتيجة NSLOG ، أحصل على القيم المتوقعة. إذا كانت السلسلة تحتوي على أحرف مثل مساحة بيضاء ، أحصل على سلسلة مع الترميز. إذا لم يكن للسلسلة أي أحرف تحتاج إلى ترميزها ، فإنها تعطيني فقط السلسلة الأصلية.
لدي زر على شريط NAV يبدأ عملية استيراد الصورة عن طريق فتح ورقة عمل. بمجرد بدء تشغيل ورقة الإجراء ، تكون سلسلتي غير صالحة - ولكن فقط إذا كانت تحتوي على أحرف مشفرة. إذا كانت مجرد سلسلة "طبيعية" ، كل شيء على ما يرام ويعمل كما هو متوقع. هل أنا خارج الترميز الخاص بي؟ في البداية اعتقدت أنها قد تكون مشكلة في الذاكرة ، لكن لا يمكنني معرفة سبب تأثير ذلك على السلاسل المشفرة فقط.
هنا يتم تعريف ورقة الإجراء (والمركز الأول الذي يمكنني رؤية السلسلة المشفرة تصبح غير صالحة).
- (IBAction)importFiles:(id)sender {
NSLog(@"logging encodedSF from import files:");
NSLog(@"%@",encodedSourceFolder);//crashes right here
NSLog(@"%@",sourceFolder);
if (shouldNavigate == NO)
{
NSString *msg = nil;
msg = @"It is not possible to import or export images while in image selection mode.";
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Unable to Import/Export"
message:msg
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
[msg release];
}
else{
UIActionSheet *actionSheet = [[UIActionSheet alloc]
initWithTitle:@"What would you like to do?"
delegate:self
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:nil
otherButtonTitles:@"Import Photos (Picker)", @"Export Photos", nil, nil];
[actionSheet showInView:self.view];
[actionSheet release];
}
}
لا أحصل على أي أخطاء تحطم في وحدة التحكم. باستخدام نقاط التوقف ، تمكنت من رؤية أن encodedSourceFolder غير صالح في طريقة ورقة الإجراء.
لا يوجد حل صحيح
نصائح أخرى
يجب عليك نسخ سلسلة المجلد في المجلد في initwithfolder: الاستعلام: طريقة مثل هذا أو إنشاء سلسلة جديدة مع:
- (id)initWithFolder:(NSString*)folder query:(NSDictionary*)query {
if (self = [super init]) {
sourceFolder = [folder copy];
}
return self;
}
وإلا فإن السلسلة الخاصة بك تحصل على تلقائي في مكان آخر.
يفعل ليس استعمال retain
ل NSString
ملكيات. يستخدم copy
:
@property (nonatomic, copy) NSString *sourceFolder;
هناك العديد من الأسئلة/الإجابات هنا تشرح ذلك ، مثل استجابة كريس هانسون على: