2014-04-19 65 views
0

我在我的控制器中創建按鈕(存在於我的視圖內)的outletCollection。由於視圖已經對其包含的按鈕有強烈的參考。在創建此集合Xcode添加了此代碼
@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *cardButtons;爲什麼要擁有一個數組,如果我不想擁有它包含的對象的所有權?

請注意上面的strong關鍵字。
我的問題是:

a)爲什麼這個代碼會打破,如果使用弱而不是強?

b)數組的所有權是否會給我它所包含對象的所有權?

我對這個問題的看法:
數組是隻是一個指針的集合(在這種情況下)。由於這些指針所指向的堆的部分已經被視圖所擁有,所以我不能再追蹤:)

回答

1

一)爲什麼這個代碼將打破,如果使用弱而不強

因爲在案件收集,IB創建NSArray的實例,並在其中放置所有引用。你想保留這個數組的實例(注意,不包含它中的對象,已經存在強引用),因爲沒有更多的引用。如果你不擁有陣列 - 沒有人擁有,它會立即發佈。例如,您可以嘗試用NSPointerArray代替NSArray - 例如,它沒有強引用的對象。

所以是的,它會打破你的代碼。

B)不要陣列的所有權會給我這 包含對象的所有權?

是的,已經存在不保留引用的集合,我認爲它只是舊模板,在不久的將來,Apple將使用它們。 (例如,NSPointerArrayNSMapTable),因爲當前的最佳做法是將strong參考到其頂視圖(self.view)和weak以及其任何子視圖

2

這是正在使用強引用定義的數組。如果你使得cardButtons變弱,那麼將不會有任何其他的數組引用,並且數組將被釋放。

這些按鈕仍然存在,因爲它們的父視圖仍然有對它們的引用。

由於您需要保留對數組的引用,因此將其屬性定義爲強。

數組是否強,弱或分配對按鈕沒有影響。

2

該UIButtons是奇異保留的視圖,但NSArray沒有。所以如果你不保留NSArray,你可以在你想要的時候(例如視圖的子視圖)訪問按鈕,但是你不能通過數組訪問它們。

是的,數組默認情況下給你所有權的元素。

2

A)對集合數組的引用必須很強壯,因爲視圖不引用數組本身。只有您附加集合的類纔有參考,因此它必須是強有力的參考。如果它很弱,數組的元素仍然在內存中,但數組本身會被釋放。

B)一個NSArray總是對的數組,除非你使用內容的所有權-[NSValue valueWithNonretainedObject:]

+2

Pedant攻擊!你可以使用'CFArrayCreate'和合適的'CFArrayCallBacks'來創建一個非保留的'NSArray'(因爲它們是免費橋接的)。但是,這將是'unsafe_unretained'有效,而不是'弱',所以除非你知道你在做什麼,你不應該這樣做。 – Tommy

+0

@Tommy謝謝!徵求意見。現在我將在代碼中使用NSArray,而不是使用其他任何東西。 – aMother

相關問題