2011-02-01 94 views
0

大家好(对不起,我的英语)。我是新的客观C和iOS编程。你可以帮我吗?iOS中的内存管理

@interface RootViewController : UITableViewController 
{ 
    NSMutableArray *keysFromQuery; 
} 

@property (nonatomic, retain) NSMutableArray *keysFromQuery; 
.... 
.... 
NSString *category = [keysFromQuery objectAtIndex:0]; 

将与[keysFromQuery objectAtIndex:0]发生什么,如果我这样做:类发布] ;?

如果我在之后做了类别会发生什么:[keysFromQuery release];?

我不太清楚引用和内存机制是如何工作的。

谢谢!

回答

3

不要致电-releasecategory。你不拥有这个物体。您只能通过NARC(new/alloc/retain/copy)释放您拥有所有权的对象。欲了解更多信息,请阅读Memory Management Programming Guide

0

如果返回对象的方法没有明确声明它返回“新”,“保留”ed,“alloc”ed,“创建”或“复制”对象,则不得释放它。就这么简单。

所以,做一个释放(或自动释放)仅适用于情况下,像

[object retain]; 
[object copy]; 
[SomeClass newInstanceWithProperty: @"a"]; 
[[SomeClass alloc] initWithProperty: @"a"]; 

等。在这种情况下

所以,你不必做任何事情,“释放”你提到会很有可能会崩溃你的应用程序。

+0

+ [keysFromQuery release]之后,从容器(类别字符串)获得的对象引用将变为无效。 – 2011-02-01 22:16:12

0

如果我这样做[keysFromQuery objectAtIndex:0]将会发生什么:[category release];? 你不应该那样做,因为它是一个自动释放的对象。

如果我在之后做了类别会发生什么:[keysFromQuery release];? 当初始化后释放keysFromQuery时,NSString仍然保存。

0

不要释放对象,因为你不拥有它们,而你甚至没有分配它们。