属性@property看我就够了
- property属性的本质
-
- ivar、getter、setter 是如何生成并添加到这个类中的?
- @protocol 和 category 中如何使用 @property
- ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些?
- @property中有哪些属性关键字?/ @property 后面可以有哪些修饰符?
- atomic noatomic区别
- 怎么用 copy 关键字?
- 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- 属性关键字 readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?
- 什么情况使用 weak 关键字,相比 assign 有什么不同?
- IBOutlet连出来的视图属性为什么可以被设置成weak?
- 浅拷贝和深拷贝的区别?
- 系统对象的 copy 与 mutableCopy 方法
- 这个写法会出什么问题:@property (nonatomic, copy) NSMutableArray *arr;
- 如何让自己的类用 copy 修饰符?如何重写带 copy 关键字的 setter?
- 写一个 setter 方法用于完成 @property (nonatomic, retain) NSString *name,写一个 setter 方法用于完成 @property (nonatomic, copy) NSString *name
- @synthesize 和 @dynamic 分别有什么作用?
- 常见的 Objective-C 的数据类型有那些,和C的基本数据类型有什么区别?如:NSInteger和int
- id 声明的对象有什么特性?
- 为什么我们常见的delegate属性都用是week而不是retain/strong?
property属性的本质
@property() = ivar + getter + setter;
“属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据。使用@property 系统会自动生成setter和getter方法;
ivar、getter、setter 是如何生成并添加到这个类中的?
完成属性定义后,编译器会自动编写访问这些属性所需的方法,此过程叫做“自动合成”(@synthesize)。除了生成方法代码 getter、setter 之外,编译器还要自动向类中添加适当类型的实例变量,并且在属性名前面加下划线,以此作为实例变量的名字
@protocol 和 category 中如何使用 @property
在 protocol 中使用 property 只会生成 setter 和 getter 方法声明,并没有实现的方法,我们使用属性的目的,是希望遵守我协议的对象能实现该属性category 使用 @property 也是只会生成 setter 和 getter 方法的声明,如果我们真的需要给 category 增加属性的实现,需要借助于运行时的两个函数:
- objc_setAssociatedObject()
- objc_getAssociatedObject()
ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些?
对应基本数据类型默认关键字是
- atomic
- readwrite
- assign
对于普通的 Objective-C 对象
- atomic
- readwrite
- strong
@property中有哪些属性关键字?/ @property 后面可以有哪些修饰符?
属性可以拥有的特质分为四类:
- 原子性 nonatomic 、atomic
- 读/写权限 readwrite(读写)、readonly (只读)
- 内存管理语义 assign、strong、 weak、unsafe_unretained、copy
- 方法名 getter= 、setter=
- 不常用的 nonnull、null_resettable、nullable
atomic noatomic区别
- 系统自动生成的 getter/setter 方法不一样。如果你自己写 getter/setter,那 atomic/nonatomic/retain/assign/copy 这些关键字只起提示作用,写不写都一样。
- 对于atomic的属性,系统生成的 getter/setter 会保证 get、set 操作的完整性,不受其他线程影响。比如,线程 A 的 getter 方法运行到一半,线程 B 调用了 setter:那么线程 A 的 getter 还是能得到一个完好无损的对象。
- nonatomic的速度要比atomic快
atomic能保证线程安全吗?
- atomic可并不能保证线程安全。如果线程 A 调了 getter,与此同时线程 B 、线程 C 都调了 setter——那最后线程 A get 到的值,3种都有可能:可能是 B、C set 之前原始的值,也可能是 B set 的值,也可能是 C set 的值。同时,最终这个属性的值,可能是 B set 的值,也有可能是 C set 的值。
atomic底层实现
//implementation
@synthesize icode = _icode;
//set
-(void)setIcode:(UIImage *)icode
{
//同步代码块
@synchronized (self) {
if(_icode != icode)
{
[_icode release];
_icode = [icode retain];
}
}
}
//get
-(UIImage *)icode
{
UIImage *image = nil;
//同步代码块
@synchronized (self) {
image = [[_icode retain] autorelease];
}
return image;
}