【问题标题】:ios alloc-releaseios 分配释放
【发布时间】:2012-02-05 19:04:21
【问题描述】:

我的应用收到内存警告,因为它需要大量内存。我尝试释放每个分配。但是,有时我不知道该怎么做。

例如:我有两对 .h 和 .m 文件。其中一个与服务器建立连接,另一个与本地 SQLite 建立连接。

通常,从这些文件中调用方法的代码是这样的:

-(NSMutableArray *) getRecentActivity{
    LocalStorageController *local = [[LocalStorageController alloc]init];
    return [local getRecentActivity];
}

getRecentActivity 返回一个 NSMutableArray。

好吧,在那段代码中,我们可以看到我正在为 LocalStorageController 分配内存,但我从不调用 release 方法,所以我想,我调用该函数的次数越多,我将分配的内存越多。

如果我在初始化后调用 autorelease,它会崩溃。

此外,我通常使用这种其他类型的代码:

    ServerConnection *serv = [[ServerConnection alloc]init];
    NSMutableArray list = [serv getMyListOfContacts];

它使用 ASIHTTPRequest,如果我在第二行之后调用 [serv release];,应用程序会崩溃,并且 EXC_BAD_ACCESS 指向 ASIHTTPRequest 库中的一行。

假设如何处理这种情况?

非常感谢!

【问题讨论】:

    标签: ios release alloc


    【解决方案1】:

    第一种情况很简单;

    -(NSMutableArray *) getRecentActivity{
        LocalStorageController *local = [[LocalStorageController alloc]init];
        NSMutableArray *tmp = [local getRecentActivity];
        [local release];
        return tmp;
    }
    

    如果不查看更多实际代码,很难以一般方式解决第二种情况。

    【讨论】:

    • 您还希望保留tmp,然后将其返回autoreleased。你不能假设tmp[local release] 之后有效,除非你这样做。
    【解决方案2】:

    使用 serv 作为属性可以解决这个保留/释放问题。

    在您的 .h 中:

    @property (nonatomic, retain) ServerConnection *server;
    

    在你的 .m 中:

    @synthesize server;
    
    - (void)dealloc {
        [server release];
        // The rest of your releases here...
        [super dealloc];
    }
    
    - (void)yourMethod {
        ServerConnection *myServConnection = [[ServerConnection alloc] init];
        self.serv = myServConnection;
        [myServConnection release];
        NSMutableArray list = [self.serv getMyListOfContacts];
    }
    

    从那时起,继续在此类中使用 self.serv,释放对象不会有问题。

    【讨论】:

    • 我只是展示了代码在哪里发布,但你是对的。我更新了我的答案。感谢您指出这一点!
    • 再编辑一次,你应该把对super dealloc的调用放在底部。
    • 首先,感谢您的回答。我意识到我的示例是错误的:似乎我无法释放它,因为我正在异步使用 ASIHTTPRequest,因此它需要为委托保留在那里。如果我这样做,它会再次崩溃......那么,你现在会怎么做?
    • 将其用作属性,但在您的 - (id)init 函数中对其进行初始化。
    • 我是这样说的,但它会导致同样的错误。我认为,由于答案可能会在几秒钟后到达,如果我释放服务器,它不能处理响应,因为释放首先出现,所以 ASIHTTPRequest 不能调用委托,因为它已经被释放。我不知道我解释得好不好......但是如果我这样做它会崩溃,如果我什么都不做,它会保留在内存中,不是吗?
    猜你喜欢
    • 2014-07-05
    • 2011-12-09
    • 2014-12-18
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    相关资源
    最近更新 更多