1、@property和@synthesize的用途:
@property、@synthesize用于自动生成类成员变量的存取方法(setter方法和getter方法)。
@property用在头文件里边,而@synthesize用于源文件里边。( xcode4.5以及以后的版本,@synthesize可以省略)
在默认情况下,当源文件里边没有实现setter和getter方法时,通过synthysize可以自动生成标准的setter和getter方法。注意:通过synthysize实现的setter和getter都是原子性访问的。多线程同时访问时,保障访问方法同时只能被一个线程访问。
如:
(1)YtsStudent.h:
#import <Foundation/Foundation.h>
@interface Student : NSObject
{
int _age;
int _no;
}
@property int age;
@property int no;
@end
(2)YtsStudent:m
#import "Student.h"
@implementation Student
@synthesize age=_age, no=_no,name; //因为代码中没有定义成员变量name,所以系统将自动生成一个成员变量name。
@end
2、@property的声明列表主要包括:
1.声明属性的访问方法:
getter=getterName
setter=setterName
声明访问属性的设置与获取方法名。
2.声明属性的写操作权限
readwrite -- 声明属性为读写属性,即可访问setter方法,也可以访问getter方法,与readonly互斥。
readonly -- 声明属性为只读属性,只能访问getter方法(即只自动生成getter方法),与readwrite互斥。
3.声明写方法的实现
assign -- 声明在setter方法中,采取直接赋值来实现设置操作。
效果如:
-(void)setName:(NSString *)_name{
name =_name;
}
retain -- 声明在setter方法中,需要对设置的值进行retain加1操作。
效果如:
-(void)setName:(NSString *)_name{
if(name!=_name){
[name release];
name = [_name retain]
}
}
copy -- 指定应该使用对象的副本(深度拷贝),对原值发送一条release消息,然后再copy。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。
效果如:
-(void)setName:(NSString *)_name{
if(name!=_name){
[name release];
name = [_name copy]
}
}
注意:
(1)assign、retain、copy在使用上的区别:
如果将一个对象赋给某成员变量,那么使用retain时,当外面的对象改变,则成员变量的值也会改变;
如果使用copy,因为是拷贝产生了新的对象,所以name不会改变。
建议:
(1)使用assign : 基础数据类型(NSInteger,CGFloat)和C数据类型(int, float, double, char等等)。
(2)使用copy : NSString。
(3)使用retain : 其他NSObject和其子类。
4. 声明方法的原子性
nonatomic -- 设置属性的访问为非原子性访问。
在默认情况下,通过synthysize实现的setter和getter都是原子性访问的。多线程同时访问时,保障访问方法同时只能被一个线程访问。
来源:oschina
链接:https://my.oschina.net/u/1027778/blog/188652