У меня возникла проблема со строкой, которая содержит закодированные символы. В частности, если строка имеет закодированные символы, она в конечном итоге становится недействительной, а «нормальная» строка - нет.Закодированный 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 недействителен в методе действия.
вы можете также использовать «sourceFolder = [[NSString Alloc] initWithString : папка];» – schaechtele
sourceFolder = [копия папки]; приводит к такому же поведению. Строка с закодированными символами становится недействительной в том же месте, в то время как строка без кодированных символов остается. – shoreline
sourceFolder = [[NSString alloc] initWithString: folder]; также приводит к поведению в исходном посте. – shoreline