objective-c @property和@synthesize

@property

在xcode4.4以前,编译器只要看到@property,就知道我们要生成某一个属性的getter/setter方法的声明
在4.4以后对@property进行增强,以后只要利用一个@property就可以同时生成setter/getter方法声明和实现,不必写@synthesize

没有告诉@property要传入的参数赋值给谁,默认@property会将传入的值赋给有下划线开头的那个成员变量
如果使用@property来生成setter/getter方法,可以不写成员变量,系统会自动生成一个_开头的成员变量,但是生成的成员变量是一个私有的成员变量,相当于在.m文件中生成的
弊端:他只会生成最简单的getter/setter方法和声明,并不会对传入的值进行过滤
需要对数据进行过滤,就必须对setter/getter进行重写
如果重写了setter方法,那么就只生成getter方法
如果重写了getter方法,那么就只生成setter方法
如果同时重写了getter/setter方法,那么就不会自动帮我们生成私有的成员变量
@property NSString *info;
- (void)setInfo:(NSString *)info;
- (NSString *)info;

- (void)setInfo:(NSString *)info
{   
    _info = info;
}
- (NSString *)info
{
    return info;
}

作用一致,不过在定义成员变量时,成员变量一定要在前方加下划线,而使用@property时要删除下划线


@property修饰符

格式:@property(属性修饰符) type name;
  • readonly:代表只生成getter方法不生成setter方法
  • readwrite:代表既生成getter方法,又生成setter方法
修改getter和setter方法名字
@property(getter = funName) NSString * info;
@property(setter = funName) NSString * info;

一般BOOL类型属性的值,将获取的方法名称改为isXXXX,便于阅读

retain和assign
  • retain:自动帮我们生成getter/getter方法内存管理代码

  • assign:不会帮我们生成set方法内存管理的代码,仅仅只会生成普通 的getter/getter方法,默认什么都不写就是assign

     使用retain会生成以下代码
    
- (void)setClassName:(ClassName *)classname
{
    //判断传入的对象和当前对象是否一样
    if(_classname != classname)
    {
        //release以前的对象
        [_classname release];
        //retain传入的对象
        _classname = [classname retain];
    }
}

但凡使用了retain一定要用release

//装逼的release
//在重写dealloc中
//self. 相当于调用了retain中的set方法
self.name = nil;
//等价于
[_name release];
_name = nil;
多线程atomic和nonatomic
  • atomic:性能低(默认)
  • nonatomic:性能高,在iOS开发中99.9%使用nonatomic
@property(nonatomic, retain) type name;
//在ARC中使用strong代替retain
@property(nonatomic, strong) type name;

注意:

  1. 相同类型的property修饰符不能同时使用

     readonly和readwrite,retain和assign不能同时使用
    
  2. 不同类型的property修饰符可以多个结合在一起使用,多个之间用逗号隔开

  3. iOS开发中只要写上property,那么就立刻写上nonatomic


@synthesize

@synthesize 是一个编译器指令,他可以简化getter/setter方法的实现

  1. 在@synthesize后面告诉编译器,需要实现哪个@property生成的声明
  2. 告诉@synthesize,需要将传入的值赋给谁和返回谁的值给调用者
  3. 如果在@synthesize后面没有告诉系统将值赋给谁,系统会默认将值赋给和@synthesize后面写的名称一致的成员变量,也就是会把值给info而不是_info
@synthesize info = _info;

你可能感兴趣的:(objective-c @property和@synthesize)