0

我对 iOS 3.0+ 中的内存管理有另一个问题,我知道如果我们这样做 [varialbe release] 会将其保留释放到一个对象,但是这样的代码 -

- (void) getPostsFromJson:(NSData *)data
{
    NSError *theError = nil;

    NSDictionary *dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:data error:&theError];

    if (dict == nil) {

        [SystemStatusValues getInstance].isValidJson = NO;
        [SystemStatusValues getInstance].httpStatus = HTTP_STATUS_FAILED;

        NSLog(@"getPostsFromJson - %@ %@",
              [theError localizedDescription],
              [[theError userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
    } else {

        NSArray *keys = [dict allKeys];        
        keys = [keys sortedArrayUsingFunction:keySortByInteger context:nil];

        self.keys = keys;
        self.posts = dict;
        NSLog(@"Posts : getPostsFromJson = %@", self.posts);

        if ([keys count] < TOTAL_SECTIONS) {

            [SystemStatusValues getInstance].isValidJson = NO;

        } else {

            [SystemStatusValues getInstance].isValidJson = YES;
            if (self.nextPosts == nil) {

            }

        }

        // [keys release];
        // [dict release];
        return;
    }
}

你可以看到有两个局部变量——keys和dict,我需要在代码末尾调用[keys release]还是[dict release]?实际上我做到了,但它有时会带来粉碎。那么对于局部变量,我们不需要在使用后释放它吗?

4

3 回答 3

2

dict 和 keys 都是对自动释放对象的引用。你不应该释放它们,这会导致你的程序终止。You Don’t Own Objects Returned by Reference and You must not relinquish ownership of an object you do not own

那么对于局部变量,我们不需要在使用后释放它吗?如果您拥有这些对象,则必须在不再需要它们时释放它们,不管它的局部变量还是 ivar。

阅读此 -高级内存管理编程指南

于 2012-05-25T15:43:27.770 回答
2

这很简单

如果你分配、复制或保留一个对象,你需要释放它。否则你不会。

所以你不需要释放任何一个键或 dict(它们都是自动释放的)。

于 2012-05-25T15:51:25.100 回答
0

不要释放keys数组。因为allKeys方法可能返回自动释放NSArray的对象。所以稍后会被系统发布。

似乎deserializeAsDictionary还返回一个 autoreleased NSDictionary,所以你也不应该释放它。

释放仅使用创建的对象alloc。在这种情况下,您使用的是外部方法。您需要遵循这些方法,并查看该对象是否是使用 alloc 创建的。

于 2012-05-25T15:45:41.933 回答