iPhone NSMutableArray发布问题

时间:2010-12-17 09:54:43

标签: iphone objective-c

我有两个控制器,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];在三个地方)应用程序崩溃。

有什么建议吗?感谢。

5 个答案:

答案 0 :(得分:1)

尝试

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

答案 1 :(得分:0)

也许您要在- (void)parserDidEndDocument:(NSXMLParser *)parser- (void)dealloc再次分配对象。在释放对象时尝试将对象设置为nil(≠NULL),因此您知道它不会再次释放。

- (void)parserDidEndDocument:(NSXMLParser *)parser
{
   [objects release], objects = nil;
}

答案 2 :(得分:0)

-(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];
}

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

答案 3 :(得分:0)

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

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

self.objects = nil;

而不是手动执行发布。

答案 4 :(得分:0)

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

Object.h

@interface Object : NSObject {
    NSString *name;
}
@property (nonatomic, retain) NSString *name;

Object.m

-(void) dealloc{

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

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

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

感谢。