2010-03-30 7 views
0

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

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

Вот где определяется лист действия (и первое место, где я могу увидеть кодированные строки становится недействительным) заявления 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 недействителен в методе действия.

ответ

0

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

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

    if (self = [super init]) { 

     sourceFolder = [folder copy]; 

    } 

    return self; 
} 

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

+0

вы можете также использовать «sourceFolder = [[NSString Alloc] initWithString : папка];» – schaechtele

+0

sourceFolder = [копия папки]; приводит к такому же поведению. Строка с закодированными символами становится недействительной в том же месте, в то время как строка без кодированных символов остается. – shoreline

+0

sourceFolder = [[NSString alloc] initWithString: folder]; также приводит к поведению в исходном посте. – shoreline

0

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

@property (nonatomic, copy) NSString *sourceFolder; 

Есть несколько вопросов/ответов здесь, объясняющие это далее, такие как ответ Криса Хэнсона на:

NSString property: copy or retain?

+0

с использованием копии вместо сохранения результатов в том же поведении; строка без кодированных символов по-прежнему недействительна в той же точке моего приложения, в то время как «нормальная» строка не является недействительной и доступна. – shoreline

+0

Появляется автореализаци результата в urlEncodeValue: была проблема. Я не уверен, почему это повлияет только на строку с закодированными символами, поскольку строка проходит через нее независимо. Полагаю, мне нужно сделать копию строки в этой точке, а не в исходной папке. – shoreline