作者leondemon (狗狗)
看板MacDev
標題Re: [問題] 這種寫法的意義?
時間Tue May 1 14:24:45 2012
※ 引述《yeah200077 (爹卡路洽)》之銘言:
: 常常看別人的Code會看到這種寫法出現
: h檔:
: NSString* _str;
: property(nonatomic,copy) NSString* str;
: m檔:
: @synthesize _str = str;
: [_str release];
: 我想問的為什麼要另外宣告str assign給 _str有什麼意義?
: 我直接寫成
: property(nonatomic,copy) NSString* _str;
: @synthesize _str;
: 好像也行,不懂為什麼會這樣寫
通常
// .h
@interface Foo{
NSString *_str; //
其實這行可以不用宣告
}
@property (nonatomic, copy) NSString *str;
@end
// .m
@implementation Foo
@synthesize str = _str;
@end
---------------
@synthesize指令會幫你匹配instance variable(ivar)
如果@interface沒有宣告該ivar 則會自動幫你「合成」
另外也會幫你「合成」accessor的method
@property事實上只是幫你宣告accessor的method
另外也可以使用dot syntax來使用accessor
accessor因為是method,所以必須通過message來傳遞,例如:
[self setStr:aString];
aString = [self str];
或
self.str = aString;
aString = self.str;
至於為何要把ivar前面加上底線"_"
是因為要區別其他method的parameters
例如:
- (void) saveString:(NSString*)str{
_str = [str copy];
//也可以直接用self.str = str;
}
這樣parameter就不會跟ivar相衝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 115.30.67.74
1F:→ reon:所以@synthesize str = _str 其實就等於說用 05/01 15:56
@synthesize str
和
@synthesize str = _str
的差別,
只在於ivar是否要指定為其他名稱 把私有的ivar用底線開頭 比較好區分而已
如果你不指定ivar的名稱 則會自動用accessor的名稱來當做ivar的命名
2F:→ reon:_str 去取代 self.str 這樣囉? 05/01 15:57
3F:→ reon:就不再需要透過dot syntax這樣嗎@@ 05/01 15:58
_str是instance variable (private by default)
dot syntax是property/accessor/message (public)
兩者是截然不同的...
在get的時候你用ivar或是getter通常是沒有差
(只差在getter因為是message 速度會慢一點點)
但是set的時候 setter會根據你property的設定來決定是否retain或copy(而且是message)
但是用ivar做設定,就要自己手動管理記憶體
不過我不是很確定在ARC開啟的情況下 直接用ivar設定是否會幫你retain?
(理論上應該要是會)
※ 編輯: leondemon 來自: 119.77.246.75 (05/01 16:28)
4F:→ leondemon:property在許多Obc-C的書和官方文件都講的很清楚 05/01 16:31
5F:→ reon:這樣比較清楚了 =_str 目的原來只是別名.. 05/02 23:44
6F:→ reon:@property和synthesize 基本上我是很明白 只是一直沒去了解 05/02 23:46
7F:→ reon:=_str 這個意義為何...感謝分享:D 05/02 23:46
8F:→ reon:不過倒是感覺這功能似乎有點雞助@@"... 05/03 00:07
9F:→ Killercat:你可以想成是在.m裡面的alias 05/04 00:04
10F:→ Killercat:在.h裡面 式open的公開的 所以要寫得很清楚(也許很長) 05/04 00:04
11F:→ Killercat:但是.m裡面的alias你愛怎麼取就怎麼取(至少我是這樣用) 05/04 00:05