内存管理,将对象添加到阵列

时间:2011-01-18 11:52:48

标签: iphone

嗨朋友我正在使用此代码

-(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池,同时循环......谢谢

1 个答案:

答案 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

找到有关自动释放池的更多信息