當一個對象的屬性被保留在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
?
謝謝!
你的第一個問題不清楚,聽起來像你誤解了一些東西。你能發表一個片段來證明你在說什麼嗎?你的第二個問題有一個不正確的泛化 - 通常你使用'copy'來爲其他類有可變子類('NSString','NSArray')和'retain' /'strong'的類。此外,「UIResponder」及其子類(構成GUI元素)通常不實現「NSCopying」,因此不能用於「copy」屬性。 –
我重寫了我的第一個問題。我明白你的答案,謝謝。 – darksky
對不起,它還不是很清楚。你「呼叫」_what_「兩次」? 「改變任何創建的類的屬性」 - 你的意思是「創建_instances_」?你是否設置了一個實例的屬性來指向一個新的'NSURLRequest'實例,或者你是否將所有實例都設置爲_same_'NSURLRequest'對象,然後改變它?一個[小而獨立的例子](http://sscce.org)在這裏真的很有幫助。 –