Закодированная nsstring становится недействительной, "нормальная" nsstring остается - PullRequest
0 голосов
/ 30 марта 2010

У меня проблема со строкой, содержащей закодированные символы. В частности, если строка содержит закодированные символы, она в конечном итоге становится недействительной, а "нормальная" строка - нет.

в файле .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 недопустим в методе листа действий.

Ответы [ 2 ]

0 голосов
/ 30 марта 2010

Do not используйте retain для NSString свойств. Используйте copy:

@property (nonatomic, copy) NSString *sourceFolder;

Здесь есть несколько вопросов / ответов, которые объясняют это далее, например, ответ Криса Хансона по адресу:

Свойство NSString: копировать или сохранить?

0 голосов
/ 30 марта 2010

Вы должны скопировать передаваемую в папку строку в свой initWithFolder: query: метод как этот или создать новую строку с:

- (id)initWithFolder:(NSString*)folder query:(NSDictionary*)query {

    if (self = [super init]) {

        sourceFolder = [folder copy];

    }

    return self;
}

В противном случае ваша строка будет автоматически освобождена в другом месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...