[英]Need explanation on @property/@synthesize in iOS
不是一個完整的菜鳥我對iOS編程和Ojbective-C都很陌生。 我主要來自C(DSP,微控制器),Delphi XE2 / Pascal,Visual Basic和Java(桌面和Android應用程序)的背景。
我主要從Apress的“Beginning iOS 5 Development”一書中學習了Cocoa。
最近我觀看了WWDC 2012的視頻並瀏覽了他們的一些示例代碼,我必須說我對編寫應用程序的正確方法感到困惑,更具體地說是@ property / @ synthesize字。
在本書中,大多數(並非全部)示例代碼用於定義屬性,例如
ViewController.h
@property (strong, nonatomic) NSMutableArray *list;
ViewController.m
@synthesize list;
然后所有代碼訪問合成列表
self.list
甚至簡單地說
list
現在在我閱讀的每個WWDC代碼示例中,我看到程序員定義了一個屬性,但是在.m文件中他們做了類似的事情
@synthesize list = _list;
並且有時訪問
self.list
要么
_list
我很迷惑。 什么是正確的做法? 由於Apple程序員都使用下划線,我認為我應該這樣做,但為什么這本書沒有呢? list和_list之間有區別嗎? 更重要的是,因為我在同一個對象中為什么有時使用self.list,有時候使用list / _list。
有時他們不使用@synthesize,我認為是時候他們想重新編寫自己的訪問器和mutators(到目前為止我從來都不是這樣)。
我已經在網上閱讀了這些內容,但沒有什么能夠讓我的思路正確,所以我依靠StackOverflow來實現這一點。
最后但並非最不重要的是,我更喜歡並根據當前的iOS 6最佳實踐/編程技術進行回答。 沒用,告訴我如何在舊的iOS中正確地做到這一點。
沒有正確的方法。 只有你喜歡的風格。
最新的編譯器對屬性聲明進行了隱式的綜合。
@synthesize list = _list;
。
您的代碼中沒有寫入任何內容。 它剛剛發生。
然而,這並沒有阻止你明確地這樣做。
@synthesize list = somethingelse;
因此,當您通過訪問器( self.list
)請求指向list
的指針時,您將獲得指向somethingelse
的指針
在大多數情況下, NSMutableArray *thing = self.list
相當於NSMutableArray *thing = somethingelse
而且僅僅因為Apple使用了一種風格並不意味着你必須這樣做。 每家公司通常都有自己的編碼風格。
使用@synthesize list;
的主要問題@synthesize list;
它會帶來你可以寫的風險
self.list = thing
或list = thing
。
前者使用了setList:
accessor而后者沒有並且在你的代碼中存在相關錯誤的風險,盡管它不像ARC
那么糟糕,因為你沒有發生strong
屬性泄漏。
你使用什么樣的風格,保持一致,並意識到使用ivar直接list = thing
的效果與使用它的accessor self.list = thing
這是一種語言功能,其使用在過去幾年中迅速發展,這解釋了各種形式。 使用最新的工具,您可以選擇忽略@synthesize
並使事情合理。
在這種情況下,默認行為產生與@synthesize list = _list;
相同的效果@synthesize list = _list;
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.