属性?成员变量?实例变量?
@property
声明的是属性
写在大括号里面的是成员变量
除了基本数据类型以外的是实例变量
@property
经常与@synthesize
、@dynamicy
搭配使用
@synthesize
:在Xcode4.5以前,除了定义一个属性之外,还必须在.m文件中加上@synthesize name=_name
,编译器会在编译时为我们生成setter
和getter
方法,Xcode4.5以及4.5以后不用加这个,编译器也会为我们生成。
@dynamicy
:告诉编译器不要帮我们生成setter和getter方法,自己手动实现,如果没有手动实现,但是用了self.属性,程序会崩溃
@property
修饰符
1. 线程安全类的:
atomic
(默认):
原子属性,默认是线程安全的,但是只是对于属性 的存取来说,而且并不总是线程安全:当A线程正在修改这个属性,其他线程的读写操作会陷入等待,A线程写完后B线程开始写,那么当A再读得时候就会读到B的值,而且,要是有一个C线程不小心把这个属性销毁了,那么A再去访问,程序会崩溃,所以还是要用lock来保证线程安全
性能不好
只对setter方法加锁
nonatomic
:
非原子属性,线程不安全,支持多线程访问,效率高,一般使用这个
2. 访问权限(决定生成getter还是setter方法)
readwrite
:可读可写,生成Setter和getter方法
readOnly
:只允许读,只生成getter方法
3. 内存管理类
MRC下
assign
:解决循环引用
retain
:对象的引用计数加1
copy
:适用于NSString,NSArray,NSDictionary,会复制一份对象的内容,防止在对象在不小心更改以后影响我们原来的值。
ARC
-
strong
:强引用,相当于MRC下的assign,只要有一个强引用指向一个对象,这个对象就不会被销毁 -
weak
:解决循环引用,相当于MRC下的assign,区别是会在对象被销毁后,把对象置为nil -
assig
n:基本数据类型 -
copy
:同MRC
修饰符辨别
weak
和assign
:都可以解决循环引用,但是weak会在对象被销毁后置为nil
copy
和strong
:strong是浅拷贝,拷贝一个指针指向原来的对象,与原来对象指向同一块内存;copy是浅拷贝:拷贝了原来对象的副本,内容之间不会相互影响,但是要注意,如果copy后得到的对象和被copy的对象都是NSString,也就是不可变,那么为了内存优化,不会产生新的副本。
网友评论