编码的nsstring变为无效,“正常”的nsstring仍然存在

时间:2010-03-30 04:28:27

标签: iphone encoding nsstring

我遇到了包含编码字符的字符串问题。具体来说,如果字符串有编码字符,它最终会变为无效,而“普通”字符串则不会。

<。>文件中的

@interface DirViewController : TTThumbsViewController 
<UIActionSheetDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate>
{
    NSString *sourceFolder;
    NSString *encodedSourceFolder;
}

@property (nonatomic, retain) NSString *sourceFolder;
@property (nonatomic, retain) NSString *encodedSourceFolder;
<。>文件中的

- (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 :(得分:0)

您应该在initWithFolder:query:方法中复制传入的文件夹字符串,或者使用以下命令创建新字符串:

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

    if (self = [super init]) {

        sourceFolder = [folder copy];

    }

    return self;
}

否则你的字符串会在别处自动释放。

答案 1 :(得分:0)

retain属性使用NSString。使用copy

@property (nonatomic, copy) NSString *sourceFolder;

这里有几个问题/答案可以进一步解释这一点,例如Chris Hanson在:

的回应

NSString property: copy or retain?