iPhone - 苹果崩溃释放NSMutableArray

问题描述:

这是我的代码使用NSMutableArray。iPhone - 苹果崩溃释放NSMutableArray

- (void) put:(NSString *)key value:(NSString *)value 
{ 
    Element *element = [[[Element alloc] initWith:key strValue:value] autorelease]; 
    if (self.map) { 
     [map addObject:element]; 
    } 
    else { 
     map = [NSMutableArray arrayWithObject:element]; 
    } 
} 

-(void)dealloc 
{ 
    if (map) { 
      [map release]; 
    } 

    [super dealloc]; 
} 

我的苹果崩溃在线:[地图发布];

我的代码有什么问题?

我试着释放'地图'如下。

- (void) put:(NSString *)key value:(NSString *)value 
{ 
    Element *element = [[[Element alloc] initWith:key strValue:value] autorelease]; 
    if (self.map) { 
     [map addObject:element]; 
    } 
    else { 
     map = [NSMutableArray arrayWithObject:element]; 
     [map release] 
    } 

} 

然后苹果不会崩溃。 如何解决这个问题?

+2

买桃子。苹果已知会崩溃。 – Jake 2011-05-04 08:48:39

+0

@MiRAGe:我真的很想把你的评论提交给日常的“最无用的评论” - 竞争。 – vikingosegundo 2011-05-04 08:53:57

+1

我认为MiRAGe的评论是这里发布的第二个最无用的评论。 (现在我已经评论过了,它可能排在第三位!) – deanWombourne 2011-05-04 08:55:40

如果地图是保留/复制的属性,请执行self.map=...来保留它。 [NSMutableArray arrayWithObject:element]返回需要保留的自动释放对象。

+0

感谢您的早期建议。苹果一切正常。 – 2011-05-04 08:44:42

arrayWithObject:方法返回一个自动释放对象;你需要选择保留数组:

map = [[NSMutableArray arrayWithObject:element] retain]; 

或使用initWithObject:方法:

map = [[NSMutableArray alloc] initWithObject:element]; 
+0

对于它的价值,我会使用第二个 - 它稍微高效一点,因为它不会将对象添加到autorelease池。 – deanWombourne 2011-05-04 08:56:49

您正在使用的便利初始化arrayWithObject,其中有一个隐含的autorelease。您不能release自动释放对象。