[英]iphone: problem in NSMutableArray and NSMutableDictionary
[英]iPhone NSMutableArray release problem
我有两个控制器,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];在三个地方),应用程序都会崩溃。
有什么建议么? 谢谢。
尝试
if ([delegate respondsToSelector:@selector(urlHandler:listObjectsFinishedLoading:)]) {
[delegate urlHandler:self listObjectsFinishedLoading:[objects autorelease]];
}
也许您要在- (void)parserDidEndDocument:(NSXMLParser *)parser
重新分配对象,然后在- (void)dealloc
重新分配对象。 尝试在释放对象时将其设置为nil(≠NULL),这样就知道它不会再次释放。
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
[objects release], objects = nil;
}
-(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];
}
以这种方式使用肯定有效。
您正在将objects
定义为保留属性,然后直接处理实例变量。 如果使用synthesize生成getter和setter,则让它们为您执行内存管理。
self.objects = [[[NSMutableArray alloc] init] autorelease];
和
self.objects = nil;
而不是手动进行发布。
谢谢你的帮助。 仍然不起作用,但是我感觉到问题可能出在Object类中。 释放对每个对象释放的数组调用吧?
对象
@interface Object : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
对象
-(void) dealloc{
[self.name release];
[super dealloc];
}
如果我评论[self.name版本]; 行,然后可以释放有问题的阵列,它不会崩溃,也不会泄漏。 但是随后,该应用程序在使用“对象名称”属性的其他地方泄漏了NSString。
我想念的东西可能很琐碎。
谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.