0

我已经在 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"];
}

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

4

3 回答 3

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"];

}

于 2013-02-06T07:18:22.103 回答
0

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

于 2013-02-06T07:07:19.420 回答
0

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

于 2013-02-06T07:26:17.553 回答