推 johnlinvc:以前是一定要syncthesize的,現在可以不用 01/22 23:30
→ kiii210:借問,現在只要加self.就不用synthesize,不加就會錯誤,要 01/22 23:37
→ 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, 而非直接存取成員變數吧
順帶一題, 是 Objective-C
--
╱ ̄ ̄ ̄╲
▏◢█◣ ▏
︻█︻█ ▏ 成龍表示: 是喔...
′/ ‵ ▏
╰╯ █╱
ψQSWEET ◥︶█◤
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.81.146
推 MisterX:所以@synthesize foo = _foo的意思是讓後來產生的成員變數 01/23 10:25
→ MisterX:_foo assign給 foo讓這兩個直保持一樣嗎? 01/23 10:26
推 tentenlee:就是getter跟setter 01/23 10:33
推 MisterX:我知道@synthesize foo可以產生getter和setter 01/23 10:47
→ MisterX:是問foo = _foo的意義 看完上文不確定自己瞭解的是不是對 01/23 10:48
推 Adonisy:反正我要求很低,能上架就好 XD 01/23 11:14
推 MisterX:A大謙虛了 01/23 12:47
推 kiii210:感謝解釋~受教了 01/24 22:36