2012-06-27 33 views
-1

首先問保留或複製的UIKit元素

當一個對象的屬性被保留在Objective-C,爲什麼同一類指向同一個對象的第二個實例?如果你實例化一個新類,那麼你會邏輯上想要一個單獨的類具有不同的屬性。 retain我明白只增加保留數,copy會淺拷貝。

我創建了一個保留NSURLRequest的類。我初始化了這個類的兩個實例。更改任何創建的類的屬性將會改變它們。當我使用該屬性的副本時,它停止了這個操作。然而,在線閱讀,它表示,對於不可變對象,copy基本上是一個淺拷貝,因爲您不需要單獨的實體,因爲它永遠不會被更改。在這種情況下,NSURLRequest是不可變的,所以我的例子是如何通過在不可變對象上調用copy來實現的?以下是我抄了一遍:

- (id)initWithRequest:(NSURLRequest *)request { 

    self = [super initWithNibName:nil bundle:nil]; 
    if (self) { 
     _request = [request copy]; 
    } 

    return self; 
} 

第二個問題

我一直在讀,基本上所有的不可變對象,我需要使用copy和可變對象使用retain(或現在在ARC, strong)。如果IBOutlets是weak指針,如果我在沒有Interface Builder的情況下繪製視圖,該怎麼辦? UIKit元素是copy還是retain/strong

謝謝!

+0

你的第一個問題不清楚,聽起來像你誤解了一些東西。你能發表一個片段來證明你在說什麼嗎?你的第二個問題有一個不正確的泛化 - 通常你使用'copy'來爲其他類有可變子類('NSString','NSArray')和'retain' /'strong'的類。此外,「UIResponder」及其子類(構成GUI元素)通常不實現「NSCopying」,因此不能用於「copy」屬性。 –

+0

我重寫了我的第一個問題。我明白你的答案,謝謝。 – darksky

+0

對不起,它還不是很清楚。你「呼叫」_what_「兩次」? 「改變任何創建的類的屬性」 - 你的意思是「創建_instances_」?你是否設置了一個實例的屬性來指向一個新的'NSURLRequest'實例,或者你是否將所有實例都設置爲_same_'NSURLRequest'對象,然後改變它?一個[小而獨立的例子](http://sscce.org)在這裏真的很有幫助。 –

回答

0

保留告訴iOS不要釋放那個內存,即使原始屬性或指針將自己設置爲零,這會減少保留計數。所以如果你做一個淺拷貝,將一個指針指向一個現有的對象,它將保留它。如果您需要進行深層複製,則應指定複製或創建複製構造函數。

弱引用類似於在一段內存中使用舊的「分配」方法,您不希望增加保留計數。有些情況下你可以有循環引用,並且可能永遠不會釋放內存。如果您不使用IB來創建UIKit對象,ARC將確保爲您保留內存,前提是您擁有指向該對象的有效指針。例如,如果你有一個UIButton指針作爲視圖控制器的成員,並且你動態地創建一個按鈕,只要該指針有效,它就會保留該內存,並且一旦該指針被設置爲零,就釋放它。

+0

噢,好的。請參閱我的第一個問題編輯。至於第二個問題,謝謝你的回答。所以一般來說,如果我保留一個UIKit元素並將其分配在init或viewDidLoad中,它將在視圖的整個生命週期中保留,一旦它被卸載,它會自動將計數遞減2並正確釋放它。 – darksky

+0

如果你在一個對象上執行init,它的保留計數爲1,當你需要刪除那個對象時,你只需調用release來減少retain。這就是說,如果你使用ARC,你只需要擔心指針的生命,編譯器會爲你插入正確的保留和釋放 – rooster117