01).@property
01>.自动生成getter 和 setter 方法的声明
自动给当前类生成一个私有属性(在@implementation中),这个属性名称自带下划线
自动生成getter 和 setter 方法的实现
02>.语法格式
@property 数据类型 去掉下划线的属性名称;
批量生成
@property 数据类型 名称,名称,….;
注:类型必须相同
@property NSString *name,color;
03>.@property 生成的实现,没有逻辑验证
//重写
- (void)setName:(NSString *)name
{
if(name.length < 2)
{
_name = @"无名";
}
else
{
_name = name;
}
}
重写后依然会自动生成getter方法的实现
注:如果getter 和 setter 方法的实现全部重写,就不会自动生成私有属性了,需要自己写
04>.@property可以带参数
语法格式:
property(参数1,参数2,参数3......)数据类型 名称;
可变性 (Mutability)
readonly,只生成getter方法,没有setter方法
readwrite,是默认的
内存管理 (Memory management)
assign,是默认的,适用于内置类型(int, bool等)或者代理对象(delegate),不存在引用计数机制。
retain,只适用于对象,不适用内置类型(int, bool等)。当使用setter方法时,将对象的引用计数加1。
copy,使用setter方法时,拷贝一个对象,即在内存中产生新对象,而不是把原来的对象的引用计数加1。显然,复制出来的新对象的引用计数为1。
并发性 (Concurrency)
nonatomic,访问属性非原子性,一般单线程声明nonatomic,考虑到速度问题。多线程程序就不要使用nonatomic。
atomic,访问属性原子性,与nonatomic相反。
API控制 (API control)
getter=newGetterName,指定新的getter方法名,一般重新改写BOOL实例变量的getter名。
@property(getter = isFinished)BOOL finished;
02).@synthesize
1>.自动生成getter 和 setter 方法的实现
2>.语法
@synthesize @pro名称;
写在@implementation里,是真私有属性
@synthesize name; //生成的私有属性是不带下划线的
03>.自动生成私有属性
解决方法 @synthesize @pro名称 = 已经存在的属性名;
@synthesize name = _name;
04>.注意
类型不同也能批量生成
@interface HMPerson : NSObject
@property NSString *_name;
@property int _age;
@end
@implementation HMPerson
@synthesize name = _name,age = _age;
@end
03).setter和getter方法的调用
//显示调用(发送消息)
[somePerson setName:@"小明"]; //setter
[somePerson name]; //getter
//隐式调用(点语法)
somePerson.name = @"Jack"; //setter
NSString *perName = somePerson.name; //getter
//在实例方法中直接使用实例变量
-(void)someMethod
{
NSString *myString = _name;
_name = @"A string";
}
显然直接使用实例变量会有风险,如内存泄露、循环引用等。最好访问实例变量,都通过@property产生的setter和getter方法。