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?