我有一个NSString
属性:
.h文件
@property (nonatomic, retain) NSString *str;
.m文件
@synthesize str;
没有retain count
/ str
的{{1}} alloc
是什么?我可以在方法中init
吗?
答案 0 :(得分:3)
我假设您对内存管理的概念不熟悉,因此我建议您在继续开发之前阅读memory management周围的苹果文档。
基本内存管理规则
- 您拥有自己创建的任何对象。
- 您可以使用retain来获取对象的所有权。
- 当您不再需要它时,您必须放弃您拥有的对象的所有权。
- 您不得放弃您不拥有的物品的所有权。
为了更好地理解内存管理,我将向您推荐苹果文档中的Memory Management Policy
因此,当您阅读了Apple文档时,您将完全理解代码中发生了什么,但如果您不这样做,那么这就是错误的。您无法释放您没有所有权的对象。这违反了apple docs中基本内存管理规则的第4点。要获得此对象的所有权,您必须在.m文件中执行str = [[NSString alloc] init];
(ARC不需要这样做)。
我的建议是阅读ARC,这比自己处理内存管理要好得多。正如你自动完成的那样,一旦你想放弃对象的所有权,你就不再需要做[str release];
这样的事情了。
答案 1 :(得分:2)
您无法释放尚未分配的对象。
尽可能使用ARC,并阅读过去两年内对Objective-C的更改:不再需要在.m中合成.h中声明的变量
答案 2 :(得分:2)
你不应该release
一个尚未分配的对象。但是如果你这样做,就意味着你正在向nil
对象发送消息。这是安全的,因为发送给nil
的邮件不会执行任何操作并返回nil
,Nil
,NULL
,0
或0.0
。
答案 3 :(得分:2)
是的,你可以发布这个对象。每当您向对象发送alloc, copy, new, retain
任何这些消息时。它的保留计数增加1.您成为该对象的所有者。因此,您必须释放该对象以放弃所有权。
当您使用ARC时,编译器会为您执行此操作。希望它有所帮助。
答案 4 :(得分:1)
作为retained
属性,您可以安全地self.str=nil;
代替[str release]
。
您可以不尽可能[str release]
{我} release
我们自己alloc
和init
而不是init
。