property
@property基本使用
- 背景: @porperty是一个编译器指令, 在Xocde4.4之前, 可以使用@porperty来代替getter/setter方法的声明, 也就是说我们只需要写上@porperty就不用写getter/setter方法的声明, 由编译器生成某一个属性的getter/setter方法的声明
Person.h中代码示例
#import
@interface Person : NSObject
{
int _age;
}
//- (void)setAge:(int)age;
//- (int)age;
@property int age;//Xocde4.4之前, 相当于上面两句
@end
@synthesize基本使用
背景: @synthesize是一个编译器指令, 它可以简化getter/setter方法的实现
什么是实现: 在声明后面写上大括号就代表着实现
作用: 1.在@synthesize后面告诉编译器, 需要实现哪个@property生成的声明; 2. 告诉@synthesize, 需要将传入的值赋值给谁和返回谁的值给调用者
Person.m中代码示例
#import "Person.h"
@implementation Person
/*
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
*/
@synthesize age = _age;//等价于上面的两个方法
//注意:如果在@synthesize后面没有告诉系统将传入的值赋值给谁, 系统默认会赋值给和@synthesize后面写得名称相同的成员变量
@end
@property增强
背景: Xcode4.4以后apple对@property进行了一个增强, 以后只要利用一个@property就可以同时生成setter/getter方法的声明和实现
-
@property有一个弊端: 它只会生成最简单的getter/setter方法的声明和实现, 并不会对传入的数据进行过滤
- 如果想对传入的数据进行过滤, 那么我们就必须重写getter/setter方法
- 如果不想对传入的数据进行过滤, 仅仅是提供一个方法给外界操作成员变量, 那么就可以使用@property
-
@property自动生成一个_开头的成员变量:
- 如果利用@property来生成getter/setter方法, 那么我们可以不写成员变量, 系统会自动给我们生成一个_开头的成员变量
-
注意:
- @property自动帮我们生成的成员变量是一个私有的成员变量, 也就是说是在.m文件中生成的, 而不是在.h文件中生成的
- 如果同时重写了getter/setter方法, 那么property就不会自动帮我们生成私有的成员变量
@property修饰符
-
读写权限:
-
readonly
: 只会生成getter方法 -
readwrite
: 既会生成getter也会生成setter, 默认什么都不写就是readwrite
-
-
getter、setter:
-
getter
: 可以给生成的getter方法起一个名称 -
setter
: 可以给生成的setter方法起一个名称
-
-
多线程相关:
-
atomic
:性能低(默认) -
nonatomic
:性能高(开发中使用nonatomic)
-
-
内存管理相关:
retain
: 就会自动帮我们生成getter/setter方法内存管理的代码, 用于MRCassign
: 不会帮我们生成set方法内存管理的代码, 仅仅只会生成普通的getter/setter方法,用于基本数据类型, 默认什么都不写就是assignstrong
: ARC中保存一个对象用strong, 相当于MRC中的retain, 用于ARCweak
: 在ARC中如果 弱引用对象不要用assign, 用weak, assign是专门用于保存基本数据类型的, 如果保存对象用weak关于内存管理的修饰符,详见: property 关键字的区别详解:assign 与weak、 __block 与 __weak、strong 与copy的区别