一般来说,我是 iOS 开发的新手,从未处理过手动引用计数(保留、释放、自动释放)。因此,我对魔术 ARC 的表现不太了解。
我以为我明白了,直到有人问我应该为指向对象的只读属性赋予什么类型的所有权( weak
, strong
,等),例如:assign
@property (readonly,nonatomic) NSString* name;
我在这里阅读了
有关 ARC中只读 @property 的问题,除非您在属性时指定支持变量,否则不会实际编译strong
/ ;我只是碰巧指定了一个像这样的支持 ivar:weak
@synthesize
@synthesize name = _name;
现在我知道变量的默认“生命周期限定符”很强大,从这里开始:http: //developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref /doc/uid/TP40011226-CH1-SW4
所以长话短说 - 我间接地将我的属性定义(readonly,nonatomic,strong)
为_name
ivar 被隐式声明为__strong
.
我有几个问题:
是否
strong
使用正确的生命周期限定符?我假设是这样,否则支持 my 的对象NSString*
将不会在任何地方拥有,因此会被自动释放(来自 Java 领域这是有道理的,因为默认情况下所有引用都是强的)。在这种情况下是否有任何其他修饰符有意义,例如
copy
orassign
?将属性声明为
(readonly,nonatomic,strong)
并对使用该属性(readonly,nonatomic)
的代码有任何影响吗?例如。在没有关键字的情况下声明它会导致对象指针存储为属性将存储在指针中的位置吗?strong
__unsafe_unretained
strong
__strong
谢谢!
编辑
据我所知,以下适用于只读属性:
- 对于非 NSObject* 类型(int、float、void* 等),请使用
(readonly, assign)
. - 对于对象指针,使用
(readonly, strong)
or(readonly, copy)
- 这些功能与只读属性相同,但如果您扩展/子类并将属性重新声明为readwrite
. - 对于对象指针,
(readonly, weak)
只有当您要在该属性中存储一个已经很弱的指针时才有意义(该指针在其他地方必须是强的,否则对象将被释放)。