談Objective-C中的property

來源:互聯網
上載者:User

property大概是objc中唯一的元編程機制,用來快速地產生類的資料成員的get和set方法。本文談談我對property的一些使用心得。

1)retain,copy和assign:

retain的作用在於產生set方法時該資料成員(一定是objc對象)的引用計數+1,通常用於除NSString類型以外的objc對象。如

- (void)setMember:(Member *)member<br />{<br />[member_ release];<br />member_ = [member retain];<br />}
一個常見的例外是delegate的set方法通常設為assign,這是為了避免循環參考造成的引用計數無法歸0,然後記憶體流失——考慮一個view的delegate為該view所在controller的情況。

NSString類的對象的set方法設為copy,字串對象需要深拷貝。

變數的set方法都應設為assign。

2)優雅地釋放成員對象。

以controller為例,通常在viewDidUnload方法和dealloc方法中需要釋放成員對象,直接的方法是

[member_ release];

這樣做的問題在於產生了野指標,在多線程的程式中也許會產生意想不到的bug——如果程式的設計比較奇特,

並且運氣足夠差的話。

優雅的做法是

self.member = nil;

展開來就是

[member_ release];<br />member_ = nil;
3)nonatomic和atomic

atomic即原子的意思,在多線程的程式中,atomic的資料成員在讀寫時會加鎖,以極小的額外開銷保證資料的安全。nonatomic則認為該資料成員不會同時被多線程讀寫。

個人的觀點——在實際編程中準確判斷一個資料成員是否有可能被多線程同時讀寫是不現實的,所以不必用nonatomic,由此造成的額外開銷可以忽略不計。

濫用nonatomic也許會造成意料不到的bug——運氣足夠差的話。

4)私人與公有

應該盡量把property設成私人的——這樣能讓類的標頭檔看起來簡潔很多。通常而言,一個controller中的幾乎所有資料成員的property都可以設成私人的——否則意味著程式的設計很可能存在問題。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.