在自动释放池 内释放创建的自动释放对象 [关闭]

Posted

技术标签:

【中文标题】在自动释放池 内释放创建的自动释放对象 [关闭]【英文标题】:release outside created autoreleased object inside a autoreleasepool [closed]在自动释放池 内释放创建的自动释放对象 [关闭] 【发布时间】:2013-05-07 22:28:03 【问题描述】:

如何强制自动释放池释放我在自动释放池之外创建的自动释放对象

我正在使用的代码

- (void)connectionDidFinishLoading:(NSURLConnection *)theConnection 

    NSError *error = nil;
    id response = [NSJSONSerialization JSONObjectWithData:responseData options:nil error:&error];
    [responseData release];
    if (error) 
            NSLog(@"ERROR JSON PARSING : %@", error.localizedDescription);
    

    [delegate databaseUpdates:response connection:self];


- (void)databaseUpdates:(id)_updates connection:(URLConnection *)_urlConnection 
    if (_updates) 

        NSDictionary *updates = nil;
        @autoreleasepool 

            updates = [[_updates valueForKey:@"objects"] retain];

            //Release _updates here!?!
        
    

非常感谢

【问题讨论】:

【参考方案1】:

只需在自动释放池范围内调用autorelease,就会自动将对象添加到池中。不过,看起来您正在尝试在这里解决错误的问题。如果你的意思是_updates,那么这不应该是方法的内存管理,而是调用者的内存管理(它已经是!JSONObjectWithData:options:error: 已经返回一个自动释放的实例),如果你的意思是updates,那么,简单不要保留它。

【讨论】:

谢谢,我会尝试在我的 autoreleasepool 中调用 autorelease on _updates。 @user1839842:不,JustSid 是你不应该releaseautorelease _updates。你不会发布你没有保留在那个范围内的东西。 我找到了另一种方法来减少我的内存警告问题。我删除了 databaseUpdates: 方法中的自动释放池。 _updates 对象将在 databaseUpdates: 方法结束时被删除。感谢您的帮助!【参考方案2】:

这是不可能的。我想你需要这个

- (void)connectionDidFinishLoading:(NSURLConnection *)theConnection 
    @autoreleasepool 
        NSError *error = nil;
        id response = [NSJSONSerialization JSONObjectWithData:responseData options:nil error:&error];
        [responseData release];
        if (error) 
                NSLog(@"ERROR JSON PARSING : %@", error.localizedDescription);
        

        [delegate databaseUpdates:response connection:self];
     // response will be released here

【讨论】:

以上是关于在自动释放池 内释放创建的自动释放对象 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

0c-36-自动释放池应用场景

在 posix 线程上创建自动释放池

异步自动释放池

自动释放池

iOS之深入解析自动释放池autoreleasepool的底层原理

具有大量自动释放对象的线程如果是/否,在这种情况下是不是必须使用自动释放池,为啥?