定义Property时的那些属性

2016-01-20  本文已影响0人  西门闲话

最近第一次接手了一个iOS的开发项目。通过这次项目对iOS开发中使用的Objective-C的语法有了一些初步认识。

对于软件开发来说定义Property是必不可少的。Objective-C在定义Property的时候就有可以指定属性来修饰Property。

整理了一下常用的大致有以下几个。

其中常用的组合:

// 通常声明property的似乎,都是这3种组合
@property (nonatomic, strong) NSMutableArray *array;
@property (nonatomic, copy) NSString *iconName;
@property (nonatomic, assign) BOOL shouldRemind;

// 但是在声明storybord的UI控件的Outlet时,也会用这种组合
@property (nonatomic, weak) IBOutlet UITextField *textField;

各种属性的说明是这样的。

属性 说明
nonatomic 非线性安全,与之相对应的是atomic
strong 强引用,与之相对应的是weak
weak 弱引用,与之相对应的是strong
assign 简单赋值
copy 复制赋值

nonatomic很好理解,iOS中和UI相关的通常指定非线程安全就可以了,不过nonatomic虽然很常用,但它不是默认的属性,默认的是atomic。

strong和weak是一对相对的属性,Xcode4还是5引入ARC(自动引用计数)来管理内存后,新添加的一对属性。其中被strong修饰的property指向一个对象后,会触发该对象的ARC自加,同样当着这个property被设成nil后,该对象的ARC会自减;被weak修饰的property指向一个对象时,不会触发该对象的ARC自加,相对的被设成nil后,该对象的ARC也不会自减,同样当该对象的ARC归零后被会系统回收后,weak修饰的property也会自动被设成nil。

最后就是assign和copy其实还有一个retain,关于这组修饰用的属性,涉及到property实现的。

@interface NewClass ()
// 通常我们是向下下面一样定义property
@property (nonatomic, copy) NSString *propertyName
@end

@implementation AllListsViewController {
    NSString *_propertyNewName;
}
// 当然我们也可以这么定义property
@synthesize propertyNewName = _propertyNewName;

// getter
- (NSString *) propertyNewName {
    return _propertyNewName
}

// setter
- (void) setPropertyNewName:(NSString *)propertyNewName {
   // 暂留
}
@end

而这3个修饰用的属性的区别就在setter里面

- (void) setPropertyNewName:(NSString *)propertyNewName {
   // assign是大概这个样子的。
   _propertyNewName = propertyNewName;
}
- (void) setPropertyNewName:(NSString *)propertyNewName {
     // copy是大概这个样子的。
     [_propertyNewName release];
     _propertyNewName = [propertyNewName copy];
}
- (void) setPropertyNewName:(NSString *)propertyNewName {
     // copy是大概这个样子的。
     [_propertyNewName release];
     _propertyNewName = [propertyNewName retain];
}

以上就是几个常用的来修饰property的属性,初次之外还有readonly和readwrite这两个,顾名思义这两个属性就是控制property的读写权限的。

上一篇 下一篇

猜你喜欢

热点阅读