嗨朋友我正在使用此代码
-(void)searchItem:(NSMutableArray*)items
{
if ([[[items objectAtIndex:1]objectForKey:@"Success"]isEqualToString:@"True"]) {
NSMutableArray *searcharr=[[NSMutableArray alloc]init];
for (int i=2; i<[items count]; i++)
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
[searcharr addObject:[items objectAtIndex:i]];
NSLog(@"data fetch array is====> /n%@",searcharr);
[pool release];
}
searchItemsArray=[[NSMutableArray alloc]initWithArray:searcharr];
[searcharr release];
searcharr=nil;
}
我已经在dealloc方法中发布了searchItemsArray。我从webservice.It获取的项目数组包含图像和其他数据。我使用的是没有NSAutoreleasePool的for循环,但是当我使用带有模拟器的仪器时,我得到了在这里泄漏。我只是想知道我在这里用池给出的代码是否正确。我的应用程序也崩溃了,因为我在tableview cell中提供这些数据和图像。所以请帮助我。 还有一件事我应该总是使用NSAutorelease池,同时循环......谢谢
答案 0 :(得分:0)
如果方法“ - (void)searchItem:(NSMutableArray *)items”被多次调用,那么每次都会分配searchItemsArray导致内存泄漏。如果在dealloc中调用release,则意味着只释放在方法的最后一次调用时创建的实例。
你可以做类似的事情:
- (无效)searchItem:(NSMutableArray的*)的项目 {
if ([[[items objectAtIndex:1]objectForKey:@"Success"]isEqualToString:@"True"]) { if( nil == searchItemsArray ) searchItemsArray = [[NSMutableArray alloc]init]; else [searchItemsArray removeAllObjects]; for (int i=2; i<[items count]; i++) { [searchItemsArray addObject:[items objectAtIndex:i]]; }
}
如果您使用alloc / init创建了items数组,那么在调用“ - (void)searchItem:(NSMutableArray *)items”之后,您还需要释放它。
如果在一个循环中你创建了许多你以后不会使用的自动释放对象,那么自动释放池就是一个选项。
每次--autorelease被发送到一个对象,它被添加到最里面的自动释放池。当池被耗尽时,它只是发送-release给池中的所有对象。
自动释放池只是一种便利,允许您推迟发送 - 直到“以后”。 “稍后”可能会在多个地方发生,但Cocoa GUI应用程序中最常见的是在当前运行循环周期结束时。
NSAutoreleasePool *pool; pool = [[NSAutoreleasePool alloc] init]; for(int i = 0; i < 100; i++) { NSString *string = [[[NSString alloc] init] autorelease]; /* use the string */ } [pool drain]; //or release if you don't plan to use the pool later.
代码未编译,对不起可能的错误。
您可以在此link
找到有关自动释放池的更多信息