Re: [問題] 這種寫法的意義?
※ 引述《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
→
05/01 15:56, , 1F
05/01 15:56, 1F
@synthesize str
和
@synthesize str = _str
的差別,
只在於ivar是否要指定為其他名稱 把私有的ivar用底線開頭 比較好區分而已
如果你不指定ivar的名稱 則會自動用accessor的名稱來當做ivar的命名
→
05/01 15:57, , 2F
05/01 15:57, 2F
→
05/01 15:58, , 3F
05/01 15:58, 3F
_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)
→
05/01 16:31, , 4F
05/01 16:31, 4F
→
05/02 23:44, , 5F
05/02 23:44, 5F
→
05/02 23:46, , 6F
05/02 23:46, 6F
→
05/02 23:46, , 7F
05/02 23:46, 7F
→
05/03 00:07, , 8F
05/03 00:07, 8F
→
05/04 00:04, , 9F
05/04 00:04, 9F
→
05/04 00:04, , 10F
05/04 00:04, 10F
→
05/04 00:05, , 11F
05/04 00:05, 11F
討論串 (同標題文章)
MacDev 近期熱門文章
PTT數位生活區 即時熱門文章