當前位置:網站首頁>synthesize關鍵字的說明

synthesize關鍵字的說明

2022-01-27 04:58:21 SuperChaoXu

iOS6之後LLVM編譯器引入了property autosynthesis, 即屬性自動合成。換句話說,就是編譯器會為每個@property添加@synthesze, 如以下形式 :

@synthesize propertyName = _propertyName;

這行代碼會創造一個帶下劃線的實例變量名,同時使用這個屬性生成getter和setter方法。

使用@synthesize 只有一個目的-給實例變量起個別名,或者說為同一個變量添加兩個名字。

如果要阻止自動合成,記得使用@dynamic。經典的使用場景是你知道已經在某處實現了getter/setter方法,而編譯器不知道的情况。 (為了防止編譯器使用自動合成生成新的settter/getter 會覆蓋已經存在舊的 setter/getter)。

自動合成沒有任何內存的含義,所以它根本沒有連接到ARC。

如果你已經手動實現了setter/getter方法,或者對 只讀對象 實現了getter方法,那麼自動合成不會產生任何影響。如果你在手動實現需要一個變量,只需要聲明它就可以了,不需要添加@synthesize來添加一個別名(盡管可以)。

還有一種情形需要使用@synthesize,就是當在protocol(協議)中聲明並實現屬性時。協議中申明的屬性不會自動生成setter和getter,[UiIApplicationDelegate window]就是個典型的例子。

情形1:不使用@synthesize,可以使用自動生成的帶下劃線的實例變量名。

情形2:使用@synthesize為屬性添加帶下劃線的別名,與不使用@synthesize相同。

@synthesize聲明的屬性=變量。意思是,將屬性的setter,getter方法,作用於這個變量。

@synthesize還有一個作用,就是可以指定與屬性對應的實例變量,例如我可以這樣寫

@synthesize age = myAge; 那這樣子的話我們去調用的時候self.age其實是操作的實例變量myAge,而不是_age了。

情形3: 使用@synthesize為屬性添加任意別名,此時使用自動生成的實例變量名將報錯,只能使用指定的別名。

注意

1 屬性的setter方法和getter方法是不能同時進行重寫的,這是因為,一旦同時重寫了這兩個方法,那麼系統就不會幫你生成這個成員變量了,所以會報錯,如果真的就想非要重寫這個屬性的setter和getter方法的話,就要手動生成成員變量,然後就可以重寫了。或者是用

@synthesize: @synthesize age = myAge; - (void)setAge:(NSString *)age { myAge = age; } - (NSString *)age { return myAge; }

2 在getter方法中最後返回return _age; 而不是return self.age, 點語法實際上是對setter和getter方法的調用,如果在getter方法中調用return self.age的話,就會循環調用。

3 在重寫屬性的setter方法論的時候我們一般都是這樣寫:

- (void)setInfoArr:(NSArray *)infoArr{

_infoArr = infoArr;

_infoArr = @[@"我是數組"];

}

我們需要在setter方法中加上這句_infoArr = infoArr;, 我們在重寫setter方法的時候將新值infoArr賦值給屬性變量_infoArr 以便我們在外面調用。

4. 當.h 文件中屬性為readonly, .m文件中可以不用@synthesize這個關鍵字,初始化的方式有下面幾種

例如:

@property(nonatomic,strong,readony) UILabel *placeHolderLabel;

- (void)setUpPlaceHolderLabel { _placeHolderLabel = [[UILabel alloc] init]; _placeHolderLabel.textColor = [self.class defaultPlaceholderColor]; _placeHolderLabel.numberOfLines = 0; _placeHolderLabel.userInteractionEnabled = NO; _placeHolderLabel.font = self.font; }

- (UILabel *)placeHolderLabel { UILabel *label = objc_getAssociatedObject(self, @selector(placeHolderLabel)); if (!label) { label = [[UILabel alloc] init]; label.textColor = [self.class defaultPlaceholderColor]; label.numberOfLines = 0; label.userInteractionEnabled = NO; label.font = self.font; objc_setAssociatedObject(self, @selector(placeHolderLabel), label, OBJC_ASSOCIATION_RETAIN_NONATOMIC); [self updatePlaceholderLabel]; } return label; }

@property (nonatomic,strong,readwrite) UILabel *placeHolderLabel;

總結

[email protected]的作用:是為屬性添加一個實例變量名,或者說別名。同時會為該屬性生成setter/getter方法。

2. 禁止@synthesize:如果某屬性已經在某處實現了自己的setter/getter,可以使用@dynamic來阻止@synthesize 自動生成新的setter/getter覆蓋。

3.內存管理:@synthesize和ARC無關。

4.使用:一般情况下無需對屬性添加@synthesize,但一些特殊情形任然需要,例如protocol中聲明的屬性。

版權聲明
本文為[SuperChaoXu]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201270458213978.html

猜你喜歡

隨機推薦