查找仪器中内存泄漏的原因

时间:2013-02-06 06:52:19

标签: ios memory-leaks xcode-instruments

我在仪器中运行了泄漏,它向我显示了100%值的内存泄漏。我能够看到导致问题的代码行。但不确定错误是什么..

- (void) listAllBooks {
    if (marrListFromDB != nil) {
        [marrListFromDB removeAllObjects];
        marrListFromDB = nil;
    }

    marrListFromDB = [[NSMutableArray alloc] init];
    ServerCommunicationAPI *servApi = [[ServerCommunicationAPI alloc] init];
    servApi.delegate = self;
    NSURL *url = [NSURL URLWithString:kLISTCONTENTS];
    [servApi listBooksWithDeviceID:singleton.g_strdevID deviceKey:singleton.g_strdevID andSessionString:singleton.g_strSessionID sessionKey:@"sessionKey" URL:url andRequestMethod:@"POST"];
}

错误行是最后一行。不知道为什么会导致内存泄漏...需要一些指导..

3 个答案:

答案 0 :(得分:0)

很难从提供的信息中判断,但ServerCommunicationAPI的委托属性可能被声明为(strong)?在这种情况下,servApi永远不会被释放,因为它保留了对自身的强烈引用(保留周期) 我建议您检查仪器哪种物体泄漏,这样可以使答案更容易。

答案 1 :(得分:0)

试试这个。可以解决你的内存泄漏问题。

- (void) listAllBooks {
if (marrListFromDB != nil) {
    [marrListFromDB removeAllObjects];
    marrListFromDB = nil;
}
ServerCommunicationAPI *servApi ;
marrListFromDB = [[NSMutableArray alloc] init];
if(servApi == nil){

     ServerCommunicationAPI *servApi = [[ServerCommunicationAPI alloc] init];
}//Every time it going to alloc. It's strong object may be due do this memory leak happens. 
servApi.delegate = self;
NSURL *url = [NSURL URLWithString:kLISTCONTENTS];
[servApi listBooksWithDeviceID:singleton.g_strdevID deviceKey:singleton.g_strdevID andSessionString:singleton.g_strSessionID sessionKey:@"sessionKey" URL:url andRequestMethod:@"POST"];

}

答案 2 :(得分:0)

另一个想法:也许你在一个单独的线程中执行你的代码,而没有设置自动释放池?在这种情况下,发送到servApi的消息可能会创建以后无法释放的自动释放对象,因为不存在自动释放池。
因此,如果您的代码未在主线程中执行,请检查是否已使用@autoreleasepool {...}块为您的线程设置了自动释放池。