前言
主要是簡單介紹一下我對于@property的理解项玛,不代表官方理解,僅供參考弱判。
1.@property
-
@property由成員變量和成員方法構(gòu)成襟沮。
成員變量:變量名前默認加上_ 的變量為該屬性的成員變量。
成員方法:即為set 裕循、get方法@property (nonatomic,copy)NSString *name;//屬性 //以下為@property屬性自動生成的變量及方法 { NSString *_name; } //set方法 -(void)setName:(NSString *)name{ _name = name; } //get方法 -(NSString *)name{ return _name; }
-
當給變量設置或取值時,會調(diào)用對應get净刮、set方法剥哑,這時可以在方法中加一些自己想要的操作。例如:
@property (nonatomic,assign)NSInteger *age;//屬性 //set方法 -(void)setAge:(NSInteger *)age{ _age = age + 10; } //get方法 -(NSInteger *)age{ if (age > 10) { return _age; }else{ return 0; } }
注意:
調(diào)用set淹父、get的方法為:self.age;
使用成員變量的方法為:_age;set方法里面是用_age去賦值株婴,而不是self.age,用self會導致循環(huán)調(diào)用set方法。
2.@synthesize
- @property 聲明的變量和方法暑认,都由@synthesize去幫你加上方法實現(xiàn)困介。在Xcode4.5及以后的版本中,可以省略@synthesize蘸际。
- 編譯器會默認幫你加上set座哩、get方法實現(xiàn),并且默認去訪問 "_XXX"這個成員變量粮彤,如果找不到這個成員變量根穷,則會自動生成這個私有的成員變量。
注意:
同時重寫用@propertyset和get方法會報錯:聲明的成員屬性,相當于自動生成了setter getter方法,重寫了set和get方法,與@property聲明的成員屬性就不是一個成員屬性了,是另外一個實例變量,而這個實例變量需要手動聲明
3.readonly 导坟、readwrite
- readonly為只讀特性屿良,在@property屬性中添加后,會只生成get方法惫周,不生成set方法尘惧。
- readwrite為只寫特性,在@property屬性中添加后递递,會只生成set方法喷橙,不生成get方法。
4.setter語意:assign登舞、retain重慢、copy
- 在Objective-C中,擁有三個setter語意特性:assign逊躁、retain和copy似踱,默認情況下屬性特性是assign的。
- 只要是值類型、簡單類型的類型核芽,比如說NSInteger囚戚、CGPoint、CGFloat轧简,以及C數(shù)據(jù)類型int驰坊、float、double等哮独,都應該使用assign拳芙。
- 對于含有可深復制子類的對象,比如說NSArray皮璧、NSSet舟扎、NSDictionary、NSData悴务、NSString等等睹限,都應該使用copy特性。
以上是我對@property 和 @synthesize的簡單理解讯檐,說的不對的地方或者有更多見解的地方歡迎一起討論