iPhone NSMutableArray 发布问题

Posted

技术标签:

【中文标题】iPhone NSMutableArray 发布问题【英文标题】:iPhone NSMutableArray release problem 【发布时间】:2010-12-17 09:54:42 【问题描述】:

我有两个控制器,SyncController 和 XMLController。 SyncController 向 XMLController 发送一些参数,XMLController 连接到 API 并将结果包装为 NSMutableArray 中的对象,然后将数组返回给 SyncController。

一些代码:

SyncController.h

-(void)urlHandler:(NSArray *)urlHandler listObjectsFinishedLoading:(NSMutableArray *)resultData;

SyncController.m

- (void)urlHandler:(NSArray *)urlHandler listObjectsFinishedLoading:(NSMutableArray *)resultData;

  NSMutableArray *receivedObjects = [[NSMutableArray alloc] init];
  [receivedObjects addObjectsFromArray:resultData];
  for (Object *o in receivedObjects) 
     //DO SOME STUFF
  
  [receivedObjects release];

XMLController.h

@interface XMLController : NSObject 
    NSMutableArray *objects;

@property (nonatomic, retain) NSMutableArray *objects;

XMLController.m

-(void) connectionDidFinishLoading:(NSURLConnection *) connection 
  objects = [[NSMutableArray alloc] init];

  if ([delegate respondsToSelector:@selector(urlHandler:listObjectsFinishedLoading:)]) 
    [delegate urlHandler:self listObjectsFinishedLoading:objects];
  

  //[objects release];


-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict

  // Initialize an Object

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName

  // Put some properties unto Object
  // Ad Object to the objects array
  // release Object


- (void)parserDidEndDocument:(NSXMLParser *)parser

   //[objects release];


- (void)dealloc     
    //[objects release];
    [super dealloc];

我的问题是,如何正确释放对象数组?如果我不释放它,则代码可以正常工作(执行 //DO SOME STUFF 中的操作)但它显然会泄漏。如果我释放它,无论我在哪里执行它(参见注释的 //[objects release]; 在三个地方),应用程序都会崩溃。

有什么建议吗?谢谢。

【问题讨论】:

【参考方案1】:

尝试

if ([delegate respondsToSelector:@selector(urlHandler:listObjectsFinishedLoading:)]) 
  [delegate urlHandler:self listObjectsFinishedLoading:[objects autorelease]];

【讨论】:

这个 SO 问题解释了为什么这可能是正确答案:***.com/questions/1219575/…【参考方案2】:

也许您在- (void)parserDidEndDocument:(NSXMLParser *)parser- (void)dealloc 再次释放对象。释放对象的时候尽量把对象设为nil(≠NULL),这样就知道不会再被释放了。

- (void)parserDidEndDocument:(NSXMLParser *)parser

   [objects release], objects = nil;

【讨论】:

【参考方案3】:
-(void) connectionDidFinishLoading:(NSURLConnection *) connection 
NSMutableArray *temp=[[NSMutableArray alloc] init];
self.objects=temp;
[temp release];


  if ([delegate respondsToSelector:@selector(urlHandler:listObjectsFinishedLoading:)]) 
    [delegate urlHandler:self listObjectsFinishedLoading:objects];
  

  //[objects release];



and then

- (void)dealloc     
    //[objects release];
    [self.objects release];
    [super dealloc];

以这种方式使用它绝对有效。

【讨论】:

【参考方案4】:

您将objects 定义为保留属性,然后直接寻址实例变量。如果你使用 synthesize 来生成 getter 和 setter,那么让它们为你做内存管理。

self.objects = [[[NSMutableArray alloc] init] autorelease];

self.objects = nil;

而不是手动进行发布。

【讨论】:

【参考方案5】:

感谢您的帮助。仍然不起作用,但我觉得问题可能出在 Object 类中。释放数组调用每个对象的释放对吗?

对象.h

@interface Object : NSObject 
    NSString *name;

@property (nonatomic, retain) NSString *name;

对象.m

-(void) dealloc

  [self.name release]; 
  [super dealloc];

如果我评论 [self.name release];行,然后可以释放有问题的阵列,它不会崩溃,也没有泄漏。但随后应用程序在使用 Object name 属性的其他地方泄漏了 NSStrings。

这可能是我想念的非常微不足道的事情。

谢谢。

【讨论】:

您在哪里分配 Object 的“名称”属性?

以上是关于iPhone NSMutableArray 发布问题的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 应用程序内存泄漏与 NSMutableArray 中的 UIImages

将 NSMutableArray 保存到 iPhone 文档目录

我如何对 NSMutableArray iphone 进行排序?

iPhone - 从 touchesMovedwithEvent 更新 NSMutablearray 的第 n 个对象的属性

iPhone SDK 中的 NSMutableArray、NSArray、NSString 内存泄漏

如何在 iphone sdk 中将 NSArray/NSMutableArray 转换为 NSFetchedResultsController?