内存管理何时使用发布

时间:2012-05-25 15:35:03

标签: ios memory-management

我在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]吗?实际上我做到了,但它有时会带来粉碎。那么对于局部变量,我们不需要在使用后释放它?

3 个答案:

答案 0 :(得分: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。

阅读本文 - Advanced Memory Management Programming guide

答案 1 :(得分:2)

It's simple

  

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

所以你不需要释放键或词典(它们都是自动释放的)。

答案 2 :(得分:0)

不要释放keys数组。因为allKeys方法可能会返回自动释放的NSArray对象。因此它将在稍后由系统发布。

似乎deserializeAsDictionary也会返回自动释放的NSDictionary,因此您也不应该将其释放。

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