作为iOS开发,会经常听到成员变量、实例变量和属性;那他们有什么区别吗?
实例变量
实例变量:class类进行实例化出来的对象为实例对象;比如:
Person *p = [Personnew];
成员变量
成员变量:在{ }中所声明的变量都是成员变量(实例变量是一种特殊的成员变量)。其中的hell、btn也是实例对象,id是一种特殊的class,是OC特有的对象。成员变量是私有变量,外部不会获取到。
@interfacePerson:NSObject{@publicNSString*myName;//成员idhell;// id - > classUIButton*btn;intage;}
属性变量
属性变量:属性是与其他对象交互的变量,会生成默认的setter和getter方法。苹果早期的编译器是GCC,后来发展到LLVM,LLVM在没有匹配实例变量的额属性时会自动创建一个带下划线的成员变量。注意:分类中添加的属性是不会自动生成setter和getter方法的,必须要手动添加。如果已经手动实现了get和set方法的话Xcode不会再自动生成带有下划线的私有成员变量了,因为xCode自动生成成员变量的目的就是为了根据成员变量而生成get/set方法的,但是如果get和set方法缺一个的话都会生成带下划线的变量。
给分类添加属性
.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让编译器自动生成setter和getter,可以制定属性对应的成员变量。
在Xcode4.4版本之前@property和@synthesize的功能是独立分工的:
@property的作用是:自动的生成成员变量set/get方法的声明如代码:
@propertyintage;// 它的作用和下面两行代码的作用一致- (void)setAge:(int)age; - (int)age;
注意:属性名称不要加前缀下划线,否则生成的get/set方法中也会有下划线_
@synthesize的作用是实现@property定义的方法代码如:
@synthesizeage
将@property中定义的属性自动生成get/set的实现方法而且默认访问成员变量age,如果指定访问成员变量_age的话代码如:
@synthesizeage = _age;
把@property中声明的age成员变量生成get/set实现方法,并且在实现方法内部访问_age这个成员变量,也就意味着给成员_age赋值。
注意:访问成员变量 _age 如果在.h文件中没有定义_age成员变量的话,就会在.m文件中自动生成@private类型的成员变量_age
网友评论