2010-10-24 69 views
0

的Objective C的文檔說在性能這大約保留屬性:問題有關保留的屬性屬性

「保留 指定保留應當在分配對象上調用(默認值是分配)。 以前。值發送釋放消息。「

我想我明白性質和屬性,直到我看到的UITableViewCell參考指南中是這樣的:

@屬性(非原子,只讀,保留)的UIImageView * ImageView的

然後看完上面真的搞糊塗了。

我的問題: 1)假設我有:

@interface SomeClass: NSObject { 
    NSString *b; 
} 
@property (nonatomic,retain) NSString *b; 
@end 

然後在實現文件:

@implementation SomeClass 
@synthesize b; 

- (id) initWithSomeString(NSString *c) { 
    if (self = [super init]) { 
     b = c; 
    } 
} 
@end 

這會不會增加保留對象的數量由 「B」 指出,正確?我現在感到困惑,是因爲目標C DOC說:

「保留 指定保留應當在分配對象上調用(默認爲分配) 以前的值發送釋放消息。」 2)如果上述內容正確,那麼當setter被調用正確時,retain屬性只會增加保留計數?

3)我聽說在某些地方,在自己的初始化器中調用對象的setter方法並不好。爲什麼?對我來說,如果你不這樣做,那麼你將不得不這樣做:

NSString * b = [someOtherString retain];

這看起來很奇怪,因爲你已經做出了「b」屬性。如果我對「保留」的理解是正確的(即是這樣的話)。它只有在二傳手發生),那麼這似乎真的很矛盾提前

感謝

回答

0

b = C。!會不會遞增保留計數,但

self.b = C;將遞增保留數

2)是的,第二個調用setter,所以它增加了保留計數。第一個是原始的C分配。

3)實際上,它應該是:

b = [someothestring copy]; 

你剛剛聲明的局部,覆蓋訪問您的實例變量,賦予它(現在過保留)對象,泄漏當你離開這個功能。

4)保留,因爲內部保留該對象。只讀,因爲使用此類的代碼不允許設置該字段,只有類是。

+0

感謝您的回答,但是因爲它與#4有關,所以我仍然有點困惑。我不明白你的意思是「保留,因爲內部保留了這個對象」。據我所知,你可以明確地保留在初始化的對象,但因爲它有一個只讀屬性,你不能使用setter(一個合成的)來做到這一點。所以如果你保留它的唯一方法是明確地調用retain,那麼屬性中的「retain」似乎是多餘的。 – user482393 2010-10-24 04:51:38

+0

@property中的'retain'意味着如果你沒有定義一個setter,編譯器會定義一個類似於: - (void)setFoo:(NSString *)newFoo {if(foo!= newFoo){[foo release ]。 foo = [newFoo retain]; }僅僅因爲它在.h文件中只讀,並不會阻止您覆蓋@interface MyClass()塊中的.m文件中的@property行。 – DavidPhillipOster 2010-10-24 04:57:35