的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」屬性。如果我對「保留」的理解是正確的(即是這樣的話)。它只有在二傳手發生),那麼這似乎真的很矛盾提前
感謝
感謝您的回答,但是因爲它與#4有關,所以我仍然有點困惑。我不明白你的意思是「保留,因爲內部保留了這個對象」。據我所知,你可以明確地保留在初始化的對象,但因爲它有一個只讀屬性,你不能使用setter(一個合成的)來做到這一點。所以如果你保留它的唯一方法是明確地調用retain,那麼屬性中的「retain」似乎是多餘的。 – user482393 2010-10-24 04:51:38
@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