线性安全的:nonatomic,atomic
访问权限的:readonly,readwrite
内存管理(ARC):strong,assign,weak,copy
内存管理(MRC):assign,retain,copy
指定方法名称:setter= ,getter=
weak与assign用法的不同:
1>在ARC中,出现循环引用的时候,必须要用一端使用weak,比如:自定义View的代理属性
2>已经自身对它强引用一次,没有必要再强引用一次,此时使用weak,自定义View的子控件属性一般使用weak,但是也可以使用strong
3>weak当对象销毁的时候,指针会被自动设置为nil,而assign不会,assign可以用非OC对象,而weak必须用于OC对象
4>在ARC环境下,无论是強指针还是弱指针都不需要在dealloc设置为nil,ARC会自动帮我们处理
copy的使用:
1>对于字符串和block的属性一般使用copy
2>字符串使用copy是为了外部把字符串内容改了,影响该属性
3>block使用copy是在MRC遗留下来的,在MRC,方法内部的block是在栈区的,使用copy可以把它放到堆区.在ARC中对于block使用copy还是strong效果是一样的
4>@property(nonatomic,copy)NSMutableArray*mutableArray; 使用copy修饰可变是数组时,调用了数组的添加,删除,修改的方法时,程序会因为找不到对应的方法而崩溃,因为copy就是复制一个不可变的NSArray的对象
5>想要的自己的类也支持copy的功能需要以下两个操纵:1/遵守NSCopying协议,2/实现-(id)copyWithZone:(NSZone*)zone;方法.属性中使用copy的是字符串和block.
6>在重写带copy关键字的setter时候,一定要调用一下传入的对象的copy方法,然后在赋值给该setter的方法对应的成员变量
@protocol和category中使用@property:
1>在protocol中使用property只会生成setter和getter方法是声明,我们使用属性的目的是希望遵守我协议的对象实现该属性
2>在category使用@property也是只会生成setter和getter方法的声明,如果我们真的需要给category增加属性的实现,需要借助于运行时的两个函数:1.objc_setAssociatedObject2.objc_getAssociatedObject
@synthesize和@dynamic分别的有什么作用:
1>@synthesize和@dynamic是@property两个对应的词,用来修饰属性变量的,如果@synthesize和@dynamic都没有写,默认的就是@synthesizevar = _var
2>@synthesize的语义是你没有手动实现setter和getter方法,那么编译器会自动为你加上这两个方法
3>@dynamic告诉编译器,属性的setter和getter方法用用户自己实现,不自动生成,(注意:对于readonly的属性只需要提供getter方法即可).假如一个属性被声明为@dynamicvar ,然后你没有提供setter和getter方法,在编译的时候没有问题,但是当程序运行到instance.var=someVar,由于缺少了setter方法会导致程序崩溃;或者当运行到someVar=var时.由于缺少getter方法同样会导致崩溃.也就是在编译的时候没有问题,但是在运行的时候才会执行相应的方法,这就是动态绑定.
[immutableObject copy] // 浅复制
[immutableObject mutableCopy] //深复制
[mutableObject copy] //深复制
[mutableObject mutableCopy] //深复制
copy:浅拷贝,会创建新的内存空间,并将旧的数据的地址值指向新的内存空间,当新的数据修改时候旧的也会修改,但是当新增对象的时候只会添加某一个对象。
Mutable Copy:深拷贝,会创建两个完全独立的内存空间,数据值一样。
网友评论