作為iOS開(kāi)發(fā),會(huì)經(jīng)常聽(tīng)到成員變量草娜、實(shí)例變量和屬性挑胸;那他們有什么區(qū)別嗎?
實(shí)例變量
實(shí)例變量:class類(lèi)進(jìn)行實(shí)例化出來(lái)的對(duì)象為實(shí)例對(duì)象宰闰;比如:
Person *p = [Personnew];
成員變量
成員變量:在{ }中所聲明的變量都是成員變量(實(shí)例變量是一種特殊的成員變量)茬贵。其中的hell、btn也是實(shí)例對(duì)象移袍,id是一種特殊的class解藻,是OC特有的對(duì)象。成員變量是私有變量葡盗,外部不會(huì)獲取到螟左。
@interfacePerson:NSObject{@publicNSString*myName;//成員idhell;// id - > classUIButton*btn;intage;}
屬性變量
屬性變量:屬性是與其他對(duì)象交互的變量啡浊,會(huì)生成默認(rèn)的setter和getter方法。蘋(píng)果早期的編譯器是GCC胶背,后來(lái)發(fā)展到LLVM巷嚣,LLVM在沒(méi)有匹配實(shí)例變量的額屬性時(shí)會(huì)自動(dòng)創(chuàng)建一個(gè)帶下劃線(xiàn)的成員變量。注意:分類(lèi)中添加的屬性是不會(huì)自動(dòng)生成setter和getter方法的钳吟,必須要手動(dòng)添加廷粒。如果已經(jīng)手動(dòng)實(shí)現(xiàn)了get和set方法的話(huà)Xcode不會(huì)再自動(dòng)生成帶有下劃線(xiàn)的私有成員變量了,因?yàn)閤Code自動(dòng)生成成員變量的目的就是為了根據(jù)成員變量而生成get/set方法的红且,但是如果get和set方法缺一個(gè)的話(huà)都會(huì)生成帶下劃線(xiàn)的變量坝茎。
給分類(lèi)添加屬性
.h文件
#import<Foundation/Foundation.h>@interfaceNSObject(Person)@property(nonatomic,copy)NSString*name;@end
.m文件
#import"NSObject+Person.h"#import<objc/runtime.h>/*或者 #import<objc/message.h>*/staticNSString*nameKey =@"nameKey";// name的key@interfaceNSObject()@end@implementationNSObject(Person)/**
setter方法
*/- (void)setName:(NSString*)name {? ? objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY);}/**
getter方法
*/- (NSString*)name {returnobjc_getAssociatedObject(self, &nameKey);}@end
使用:
- (void)viewDidLoad {NSObject*objc = [[NSObjectalloc] init];? ? objc.name =@"Vincent";NSLog(@"%@", objc.name);}
@property和@synthesize
@synthesize讓編譯器自動(dòng)生成setter和getter,可以制定屬性對(duì)應(yīng)的成員變量暇番。
在Xcode4.4版本之前@property和@synthesize的功能是獨(dú)立分工的:
@property的作用是:自動(dòng)的生成成員變量set/get方法的聲明如代碼:
@propertyintage;// 它的作用和下面兩行代碼的作用一致- (void)setAge:(int)age;? - (int)age;
注意:屬性名稱(chēng)不要加前綴下劃線(xiàn)嗤放,否則生成的get/set方法中也會(huì)有下劃線(xiàn)_
@synthesize的作用是實(shí)現(xiàn)@property定義的方法代碼如:
@synthesizeage
將@property中定義的屬性自動(dòng)生成get/set的實(shí)現(xiàn)方法而且默認(rèn)訪(fǎng)問(wèn)成員變量age,如果指定訪(fǎng)問(wèn)成員變量_age的話(huà)代碼如:
@synthesizeage = _age壁酬;
把@property中聲明的age成員變量生成get/set實(shí)現(xiàn)方法次酌,并且在實(shí)現(xiàn)方法內(nèi)部訪(fǎng)問(wèn)_age這個(gè)成員變量,也就意味著給成員_age賦值舆乔。
注意:訪(fǎng)問(wèn)成員變量 _age 如果在.h文件中沒(méi)有定義_age成員變量的話(huà)和措,就會(huì)在.m文件中自動(dòng)生成@private類(lèi)型的成員變量_age
轉(zhuǎn)載文章地址:http://www.reibang.com/p/1027c9d8359e