Re: [問題] 這種寫法的意義?

看板MacDev作者 (狗狗)時間13年前 (2012/05/01 14:24), 編輯推噓0(0011)
留言11則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《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
所以@synthesize str = _str 其實就等於說用
05/01 15:56, 1F
@synthesize str 和 @synthesize str = _str 的差別, 只在於ivar是否要指定為其他名稱 把私有的ivar用底線開頭 比較好區分而已 如果你不指定ivar的名稱 則會自動用accessor的名稱來當做ivar的命名

05/01 15:57, , 2F
_str 去取代 self.str 這樣囉?
05/01 15:57, 2F

05/01 15:58, , 3F
就不再需要透過dot syntax這樣嗎@@
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
property在許多Obc-C的書和官方文件都講的很清楚
05/01 16:31, 4F

05/02 23:44, , 5F
這樣比較清楚了 =_str 目的原來只是別名..
05/02 23:44, 5F

05/02 23:46, , 6F
@property和synthesize 基本上我是很明白 只是一直沒去了解
05/02 23:46, 6F

05/02 23:46, , 7F
=_str 這個意義為何...感謝分享:D
05/02 23:46, 7F

05/03 00:07, , 8F
不過倒是感覺這功能似乎有點雞助@@"...
05/03 00:07, 8F

05/04 00:04, , 9F
你可以想成是在.m裡面的alias
05/04 00:04, 9F

05/04 00:04, , 10F
在.h裡面 式open的公開的 所以要寫得很清楚(也許很長)
05/04 00:04, 10F

05/04 00:05, , 11F
但是.m裡面的alias你愛怎麼取就怎麼取(至少我是這樣用)
05/04 00:05, 11F
文章代碼(AID): #1Fdu6m3U (MacDev)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1Fdu6m3U (MacDev)