作者uranusjr (←这人是超级笨蛋)
看板MacDev
标题Re: [问题] property 与 synthesize
时间Tue Jan 22 23:56:15 2013
※ 引述《MisterX (" X " 先生)》之铭言:
1F:推 johnlinvc:以前是一定要syncthesize的,现在可以不用 01/22 23:30
3F:→ kiii210:借问,现在只要加self.就不用synthesize,不加就会错误,要 01/22 23:37
4F:→ kiii210:synthesize,这是因为...? 01/22 23:37
Rules of thumb:
1) 要嘛就完全不要用 @synthesize, 要嘛使用 @synthesize foo = _foo 惯例
2) 除非有正当理由, 否则不要使用 synthesize 产生的成员变数
请永远使用 getter/setter
所以请避免 @synthesize foo 这种写法
而且请一律使用 self.foo 存取你的 properties, 不要用 foo 或 _foo
除非你有正当理由
====
以下详解
自动合成会产生以下的成员变数/函式:
Getter
Setter (如果不是 readonly)
名称以底线开头的成员变数 (如果不是 readonly)
例如
@property (nonatomic) id foo;
会产生
- (id)foo
- (void)setFoo
以及一个 id 成员变数 _foo
所以你用 foo 没有办法存取, 因为不存在这个变数
正确的成员变数名称为 _foo
前面推荐使用 @synthesize foo = _foo 的原因有两个
第一是这是苹果现在的惯例
第二是不会与 getter 甚至函式内的区域变数搞混(应该也是苹果改采此惯例的原因)
self.foo 代表呼叫 getter/setter, 与 [self foo] 或 [self setFoo:bar] 语意相同
而 _foo(或者 foo)则是直接存取变数内容, 不会经过 getter(或 setter)
应该不需要说明为什麽要推荐使用 setter/getter, 而非直接存取成员变数吧
顺带一题, 是 Object
ive-C
--
╱ ̄ ̄ ̄╲
▏
◢█◣ ▏
︻█︻█ ▏
成龙表示: 是喔...
′/ ‵ ▏
╰╯ █╱
ψQSWEET ◥︶█◤
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.81.146
5F:推 MisterX:所以@synthesize foo = _foo的意思是让後来产生的成员变数 01/23 10:25
6F:→ MisterX:_foo assign给 foo让这两个直保持一样吗? 01/23 10:26
7F:推 tentenlee:就是getter跟setter 01/23 10:33
8F:推 MisterX:我知道@synthesize foo可以产生getter和setter 01/23 10:47
9F:→ MisterX:是问foo = _foo的意义 看完上文不确定自己了解的是不是对 01/23 10:48
10F:推 Adonisy:反正我要求很低,能上架就好 XD 01/23 11:14
11F:推 MisterX:A大谦虚了 01/23 12:47
12F:推 kiii210:感谢解释~受教了 01/24 22:36