技巧iOS基础知识记录与总结iOS学习开发

OC面试基础(1)— 说下@property关键字及修饰符

2017-03-27  本文已影响73人  Light413

@property关键字

property属于xcode编译器的关键字主要有三个作用:

声明语法:@property(attr1,attr2,attr3,...)NSString* name;

可使用的修饰关键字根据功能可分为三类:

  1. assign、retain、copy 关于set方法中属性引用计数相关 ,默认值assgin
  2. nonatomic、atomic 关于是否原子访问,默认是atomic
  3. readonly、readwrite 关于访问控制操作,默认值readwrite

所以声明属性 @property NSString* name; 等价于 @property(assgin,atomic,readwrite)NSString * name;

此外ARC之后还增加了weak、strong属性,其中weak功能与assgin相似,在修饰的属性要释放时,weak会自动其值置为nil,即使在对它发送消息时也不会crash,因为oc中可以给一个空的对象发送消息。而assign不会,直接造成野指针,若在发送消息直接导致crash。strong与retain相似,在很多场景基本通用。

属性修饰符

-(void)setName:(NSString *)name
{
    _name = name;
}
-(void)setName:(NSString *)name
{
    if (_name != name) {
        [_name release];
    }
    _name = [name retain];
}

-(void)setName:(NSString *)name
{
   if (_name != name) {
       [_name release];
   }
   _name = [name copy];
}

重写set/get方法、修改方法名 对property的影响

在property中修改set/get方法名,eg

@property(getter=getMyName,setter=setMyName:)NSString * name;

此时生成的set方法和get方法如下

-(void)setMyName:(NSString *)name

-(NSString *)getMyName

@synthesize关键字

在xcode4.5以前和property一起使用,作用:生成set/get方法的实现,添加一个带下划线的成员变量。

在@implementation中:@synthesize name = _name; 生成属性name的set、get方法来操作_name实例变量。

在xcode4.5及以后由于property实现了其功能,所以基本也不在用了。

属性 != 变量

综上可知:

@property(assgin,atomic,readwrite)NSString * name;

name在这里是一个属性,或者说是属性变量,一个属性除了有个变量之外还有相关的set或get访问方法,生成的_name才是真正的成员变量。

所以属性变量和成员变量完全是两个不同的东西。

上一篇 下一篇

猜你喜欢

热点阅读