最近第一次接手了一个iOS的开发项目。通过这次项目对iOS开发中使用的Objective-C的语法有了一些初步认识。
对于软件开发来说定义Property是必不可少的。Objective-C在定义Property的时候就有可以指定属性来修饰Property。
整理了一下常用的大致有以下几个。
- nonatomic
- strong
- weak
- assign
- copy
其中常用的组合:
// 通常声明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里面
- assgin就是指直接复制
- (void) setPropertyNewName:(NSString *)propertyNewName {
// assign是大概这个样子的。
_propertyNewName = propertyNewName;
}
- copy则是先release,然后再用参数的值copy了。
- (void) setPropertyNewName:(NSString *)propertyNewName {
// copy是大概这个样子的。
[_propertyNewName release];
_propertyNewName = [propertyNewName copy];
}
- retain和copy很像。只不过是用参数值的retain函数
- (void) setPropertyNewName:(NSString *)propertyNewName {
// copy是大概这个样子的。
[_propertyNewName release];
_propertyNewName = [propertyNewName retain];
}
以上就是几个常用的来修饰property的属性,初次之外还有readonly和readwrite这两个,顾名思义这两个属性就是控制property的读写权限的。
网友评论