清理从HTTP响应创建的NSString变量

时间:2011-09-11 08:53:52

标签: iphone objective-c xcode http

我有一个JSON响应,我将其转换为看起来像这样的NSDictionary

 response {
    cid = 30;
    female =     {
        id = 24;
        "img_url" = "/static/images/upload/24";
    };
    male =     {
        id = 26;
        "img_url" = "/static/images/upload/26";
    };
}

然后我将cid代码插入到NSString变量中,如下所示:

cid = [response objectForKey:@"cid"]; 

后来在另一种方法中,我尝试在ASIFormDataRequest中使用cid

[request setPostValue:cid forKey:@"cid"];

但是这会导致程序崩溃。如果我在此setPostValue:cid语句之前放置cid = @"7"(例如),一切正常,所以我知道请求的功能很好。同样,如果我NSLog(@"%@",cid);也有效。

我相信我的问题是identical to this one,但没有人就如何解决问题给出具体答案。

有什么想法吗?

编辑1

没有崩溃日志。 Xcode只在底栏中给我这条消息:

enter image description here

**编辑2 **

以下是我使用调试器打印的一些图像。我不知道我是否已经正确地做到了这一点。

enter image description here

以下是我如何将响应数据插入CID。 CID是在头文件中声明的NSString,其中包含整个@property(非原子,保留)位。

enter image description here

编辑3

如果我打印

NSLog(@"%@", cid);

在发布cid值之前,我收到EXC_BAC ACCESS错误

2 个答案:

答案 0 :(得分:3)

  

CID是头文件中声明的NSString,包含整个@property(非原子,保留)位。

即使您已将其声明为保留属性,也不会将其用作属性。使用:

cid = [number stringValue];

您直接将对象分配给cid,后者是后备实例变量,从而绕过将保留该对象的属性设置器。这意味着只要相应的自动释放池耗尽,cid可能不再指向有效对象。

如果您对一个应该在自动释放池排水管中存活的对象感兴趣,那么您应该拥有它。使用retain属性,这意味着调用属性setter,例如:

self.cid = [number stringValue];

这将保留分配给[number stringValue]属性的cid,如果您的程序中的其他内容在内存管理方面都是正确的,那么您将能够使用self.cid程序的其他部分,如:

  

后来在另一种方法中,我尝试在ASIFormDataRequest中使用cid

对于记录,NSString属性通常是复制而不是保留,以防止在为属性分配可变字符串时产生副作用。

答案 1 :(得分:-1)

当你拿这样的cid cid = [response objectForKey:@“cid”];然后它返回一个autorelease对象。当方法返回时它将被释放。所以尝试使用alloc。

if(cid != nil)
[cid release];
cid = [[NSString alloc] initWithString:[response objectForKey:@"cid"]];

然后

[request setPostValue:cid forKey:@"cid"];

如果这不能解决您的问题,请在此处发布。