Ovjective-c之@property @synthesize @dynamicy以及修饰符

来源:互联网 发布:nginx mp4点播 编辑:程序博客网 时间:2024/06/16 23:51

属性?成员变量?实例变量?

@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* assign:基本数据类型* copy:同MRC

修饰符辨别

  • weak和assign:都可以解决循环引用,但是weak会在对象被销毁后置为nil
  • copy和strong:strong是浅拷贝,拷贝一个指针指向原来的对象,与原来对象指向同一块内存;copy是浅拷贝:拷贝了原来对象的副本,内容之间不会相互影响,但是要注意,如果copy后得到的对象和被copy的对象都是NSString,也就是不可变,那么为了内存优化,不会产生新的副本。
0 0
原创粉丝点击