字典,自动释放池和临时对象

时间:2011-05-05 21:06:24

标签: ios objective-c memory-management autorelease

假设我的字典中包含可能存在或不存在的键的对象。检查此密钥是否存在的标准做法是什么?

例如,我写的内容如下:

    id temp;

    temp = [dict objectForKey: @"id"];
    if (temp != [NSNull null]) {
        uid = [temp intValue];
    }

    temp = [dict objectForKey: @"name"];
    if (temp) {
        [name release];
        name = [[NSString alloc] initWithString: temp];
    }

    temp = [dict objectForKey: @"latitude"];
    if (temp != [NSNull null]) {
        [latitude release];
        latitude = [[NSNumber alloc] initWithDouble: [temp doubleValue]];
    }

    temp = [dict objectForKey: @"longitude"];
    if (temp != [NSNull null]) {
        [longitude release];
        longitude = [[NSNumber alloc] initWithDouble: [temp doubleValue]];
    }

我应该使用自动释放池包围此代码吗?每次我将temp指向字典中的对象时,是否必须释放,或者池是否自动处理?有没有更好的方法来处理错误?

2 个答案:

答案 0 :(得分:1)

objectForKey: 会返回自动释放的对象,它会返回指向所需对象的直接指针,因此您需要内部自动释放池。

如果找不到所需的对象,objectForKey:将返回nil,这就是您应该在此处测试的内容:

id obj = [dict objectForKey:@"someKey"];
if(obj == nil) {
   //not found
}

此外,如果您要在整个地方执行此操作,您可能希望将这些实例变量声明为保留属性:

[ivar release];
ivar = ...;

.h文件中声明属性,如下所示:

@property (nonatomic, retain) NSNumber *latitude;

然后你会在@implementation

中执行此操作
@synthesize latitude;

完成后,您只需执行以下操作:

self.latitude = temp;

答案 1 :(得分:1)

我使用了这篇文章中描述的方法:How to map JSON objects to Objective C classes?