我在仪器中运行了泄漏,它向我显示了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"];
}
错误行是最后一行。不知道为什么会导致内存泄漏...需要一些指导..
答案 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 {...}
块为您的线程设置了自动释放池。