騰訊視頻 Objective C 的setter賦值函數 連接:http://dwz.cn/zH6nM html
1、setter和getter的通常寫法
java
setter和getter器能夠說是一個類最基本的東西,任何一門面向對象的語言,都又這個概念,C++、java等等。由於setter和getter是對面向對象語言封裝的最基本的支持。安全
在Objective-C的setter和getter器,固然也和通常的語言沒有什麼不一樣。只不過,添加了一些本身的特性。函數
好比有一個實例變量:int age;優化
先在.h文件中聲明setter和getter器atom
-(void)setAge:(int)newAge; -(int)age;
而後在.m文件中具體實現spa
-(void)setAge:(int)newAge { age=newAge; } -(int)age { return age; }
能夠看出來,在Objective-C中setter器沒什麼區別,不過getter器的方法名缺乏了get,由於get...在Objective-C有別的用處,因此getter器直接寫的就是變量名。線程
2、getter和setter 的調用方法code
通常的調用方法,是傳統的帶中括號[ ]的調用方法,好比orm
//好比上面的聲明是一個Person類 Person* person=[[Person alloc]init]; [person setAge:13]; int age=[person age];
點調用的方式
//點調用 person.age=13; //.調用出如今=號左邊,至關於setter int age=person.age //.調用出如今=號的右邊,至關於getter NSLog(@"%i",person.age);//這也是getter
3、setter和getter的改進寫法
每次要爲一個屬性寫上getter和setter,不得不手十分麻煩,因此有了更簡單的寫法,
在.h文件裏,直接這樣寫,表示聲明瞭一個實例屬性和它的getter和setter器
@property int age;
而後在.m文件中這樣寫,表示實現setteer和getter
@synthesize age;
這樣,就能夠和之前同樣調用getter和setter了。
4、setter和getter的改進優化
能夠看到,getter器的方法名直接就是變量名,方法名和變量名同樣,容易讓人迷糊,因此,能夠這樣優化。
在.h文件中依然這樣聲明
@property int age;
在.m文件中,這樣去寫,
@synthesize age=_age; //加上一個_ //這麼,咱們就能夠去使用_age 和使用age同樣 -(void)show { NSLog(@"%i",_age); }
5、@property的屬性
能夠使用屬性來規定@property,設定的方式以下:
@property (attribute1[,attrubute2,...])。
舉個例子:
@property (nonatomic,strong) Engine* engine;
若是你在@property設置了屬性,若是你使用@synthesize ,那麼它會自動幫你完成這些屬性的實現,若是你是本身手動的去完成實現的話,那麼,你必須本身寫出這些屬性的實現。
(1)、設置訪問方法的名字
默認的getter和setter器的名稱是和變量名關聯的,必定是setVirableName和virableName,好比上面的變量age,setter是setAge,getter是age。
能夠經過設置@property中的setter和getter屬性來修改setter和getter器的方法名。
getter=getterName
setter=setterName
舉個例子:
@property (getter=show1,setter=show2:)int age;//如今,它的getter和setter的方法名字就變了
注意:若是你設置了readonly屬性的話,那麼你就不該該設置setter屬性,要否則會給出一個編譯器的警告。
(2)、設置只讀或讀寫
下面兩個屬性很好理解,
readwrite:表示既有getter,也有setter
readonly:表示只有getter,沒有setter
這兩個屬性是互相排斥的,只能存在一個。
(3)、定義setter的語義
下面的屬性指定setter語義設置訪問器。他們是互相排斥的。
strong:指定有很強的(擁有)關係到目標對象。
weak:指定有弱(non-owning)關係到目標對象。若是目的地對象銷燬,屬性值將自動設置爲nil。(弱屬性不支持OS X上的v10.6和iOS 4,使用指定取而代之)。
copy:調用原始對象的copy()方法,建立一個原始對象的副本,用於分配給新的引用。原始的對象在調用release方法。固然這個屬性只用於實現了NSCopying協議的對象類型。
assign:指定使用簡單的賦值的setter。這個屬性是違約。 使用這個屬性對於標量的類型(如NSInteger和CGRect等);
retain: 指定retain應該調用對象上的。原始的對象在調用release。在OS X v10.6和以後,您能夠使用這個關鍵字用於內存管理方面。
(4)、訪問屬性的線程安全
nonatomic:表示不考慮線程安全