2014-02-08 17 views
3

我有一個具體的問題,我無法找到答案。Objective-C中@property和weak屬性的用法

我有一個故事板,有一些意見。一些意見有銷路。 據我所知,我必須宣佈我的網點爲弱參數,但我不知道是否必須聲明getter和setters(使用@property和synthesize)。

1 - __weak IBOutlet UITableView *table; 
2 - @property(nonatomic, weak) UITableView *table; 

如果我只是聲明(1)我可以做「表」視圖控制器上。

如果我聲明(1)和(2)我可以做self.table。

有什麼區別?什麼是最好的方法?

回答

4

(1)是一個實例變量聲明。 (2)是一個屬性定義。如果綜合該屬性或使用自動綜合,那麼也會創建一個實例變量。通常,除非你想公開API中的視圖或多態性,否則聲明一個實例變量就足夠了。

還有一些其他特定情況下,可能會優先選擇財產。例如,如果您想引用塊中的視圖但不希望保留self,則使用weakSelf範例可以更容易地訪問該屬性。但是你也可以創建視圖的弱引用,所以這是沒有意義的。

訪問實例變量不是使用點(.)表示法,而是直接使用或使用較少使用的箭頭(->)表示法。

因此,要麼:

[_tableView reloadData]; 

[self->_tableView reloadData]; 

請記住,在一個糟糕的訪問的零基準結果使用->

+0

謝謝你的回答。你能否指出我使用弱自我範式的例子? – Tony

+2

@Tony http://stackoverflow.com/questions/12901536/reference-to-self-inside-block –

0

對於這兩種情況,您只需「表」即可,您只需在實施中使用@synthesize合成該屬性。

+0

我在上一個答案中添加了評論。 – Tony

-1

通常沒有理由宣佈作爲一個強大的財產,暗示所有權。大多數視圖都屬於他們的超級視圖。

@property (weak) IBOutlet UITableView *table; 

然後你把與任何其他財產

@synthesize table = _table; 
- (void)someMethod 
{ 
    [self.table doSomething ....] 
} 

參見Managing the Lifetimes of Objects from Nib Files

+0

我的問題不是爲什麼我必須聲明爲弱。我真的很想知道爲什麼要聲明一個屬性(和合成)。爲什麼不直接聲明__weak IBOutlet UITableView * table ;. ? – Tony

+0

我似乎穿過了鏡子,現在我也不明白這個問題,也不知道答案。請原諒。 –

0

首先是一個實例變量,第二個是定義的屬性。該慣例總是使用現在默認爲自動合成的屬性,其中iVar在約定_varName上命名。然後您可以使用_varNameself.varName訪問該變量。建議始終通過屬性訪問變量,唯一的例外是當您重寫屬性的getter時。

相關問題