我还在学习CocoaTouch的一些细微差别。在ARC环境中为float,int等类型内部生成了什么类型的getter / setter?
我知道如果属性是非ARC的对象,我可能会有这样的事情:
- (NSURL *)url {
if (_url == nil)
_url = [[MyURL alloc] initWithURL:url];
return _url
}
- (void)setUrl:(NSURL *)theUrl {
if (theUrl != _url) {
[_url release];
_url = [theUrl retain];
}
}
但是在ARC环境中发布并保留不能使用。在这种情况下,ARC环境会自动创建什么样的getter / setter。
那么像float,int等标量类型呢?
答案 0 :(得分:4)
ARC处理所有释放和保留。您应该只使用合成的getter和setter,但如果您不这样做,只需设置ivar并删除所有其他代码。
答案 1 :(得分:3)
有几点想法:
基本数据类型(int
,bool
等)的访问器方法(getter和setter)非常类似于对象的标准访问器方法,唯一的区别是是没有内存管理语义,因为除了在对象的上下文中它们没有任何意义。因此,您将看不到具有这些基本数据类型的strong
或weak
。因此retain
的概念也不适用。
在幕后,系统为ARC中声明为strong
属性的对象生成的setter与非ARC代码中对象的retain
属性的setter没有什么不同。它增加了保留计数(a.k.a。"保持强大的参考")。现在,很明显,如果您自己为strong
属性编写ARC setter(您真的不应该这样做),那么您就不会编写代表retain
的代码行。 ,但编译器实际上是在幕后为您做这件事。
我不太确定你的getter方法,因为它没有意义。通常,getter不会为您执行任何alloc
或init
。
你的二传手更接近(我认为这是一个@property
声明为retain
)。显然,自动合成的setter会自动获取内存生命周期限定符(例如retain
vs. assign
vs. copy
vs. ...)并为您生成相应的代码,因此让它做自己的事情会更好。
顺便说一句,实际系统生成的setter也会包含KVO(key-value-notification)调用。你不必担心KVO是什么,但关键是你不希望自己的代码乱丢你自己的手写的setter方法,因为当你开始使用KVO时,你就是'我很后悔这样做了。这只是让编译器综合它自己的访问器方法的另一个原因。