تصبح NSString المشفرة غير صالحة ، وبقايا NSString "العادية"

StackOverflow https://stackoverflow.com/questions/2542871

  •  23-09-2019
  •  | 
  •  

سؤال

أنا أواجه مشكلة في سلسلة تحتوي على أحرف مشفرة. على وجه التحديد ، إذا كانت السلسلة تحتوي على أحرف مشفرة ، فإنها تصبح في النهاية غير صالحة بينما لن تكون السلسلة "العادية".

في ملف .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;

هناك العديد من الأسئلة/الإجابات هنا تشرح ذلك ، مثل استجابة كريس هانسون على:

خاصية NSString: نسخ أو الاحتفاظ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top