Закодированная 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, я получу ожидаемые значения.Если в строке есть такие символы, как пробел, я получаю строку с кодировкой.Если в строке нет символов, которые необходимо закодировать, мне просто выдается исходная строка.

У меня есть кнопка на панели навигации, которая начинает процесс импорта изображения, открывая лист действий.После запуска метода листа действий моя строка становится недействительной, но только если она содержит закодированные символы.Если это просто «обычная» строка, все в порядке и ведет себя так, как ожидалось.Я отключился от кодировки?Сначала я подумал, что это может быть проблема с памятью, но не могу понять, почему это влияет только на закодированные строки.

Здесь определен список действий (и первое место, где я вижу, что закодированная строка становится недействительной), операторы NSLog — это то место, где происходит сбой:

- (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:query:такой метод или создайте новую строку с помощью:

- (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