簡體   English   中英

在iOS中需要@ property / @ synthesize的解釋

[英]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 = thinglist = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM