ios关键字copy, retain, assign , readonly , readwrite, nonatomic、nonatomic、natomic@synthesize、@dynamic

1.使用@property配合@synthesize可以让编译器自动实现getter/setter方法,使用的时候也很方便,可以直接使用“对象.属性”的方法调用;如果我们想要”对象.方法“的方式来调用一个方法并获取到方法的返回值,那就需要使用@property配合@dynamic了;

2.使用@dynamic关键字是告诉编译器由我们自己来实现访问方法。如果使用的是@synthesize,那么这个工作编译器就会帮你实现了;

3.readonly此标记说明属性是只读的,只能生成getter方法;

4.readwrite此标记说明属性会被当成读写的,这也是默认属性,表示该属性拥有setter,getter方法;

5.nonatomic:非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访;

6.atomic设置成员变量的@property属性时,默认为atomic,提供多线程安全。atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择;

由于苹果自iOS5开始引入了ARC(Automatic Reference Counting) ,且经过几年发展ARC已然成为主流,因此在管理属性有关内存管理的特性时,我们都假设在ARC环境下使用,不考虑MRC的情况

1.strong(ARC中为默认):强引用,表示实例变量对传入的对象要有所有权关系;

2.weak:弱引用,在setter方法中,需要对传入的对象不进行引用计数加1的操作。简单来说,就是对传入的对象没有所有权,当该对象引用计数为0时,即该对象被释放后,用weak声明的实例变量指向nil,即实例变量的值为0;使用场景:

      (1)在ARC下,在有可能出现循环引用的时候,往往要通过让其中一端使用weak来解决,比如: delegate代理属性,通常就会

          声明为weak。

      (2)自身已经对它进行一次强引用,没有必要再强引用一次时也会使用weak。比如:自定义 IBOutlet控件属性一般也使用

          weak,当然也可以使用strong。

3.assign只是简单赋值,适用于基本数据类型.assign其实也可以用来修饰对象。那么我们为什么不用它修饰对象呢?

   因为被assign修饰的对象(一般编译的时候会产生警告:Assigning retained object to unsafe property; object will 

   be released after assignment)在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil,造成野指针。对象

    一般分配在堆上的某块内存,如果在后续的内存分配中,刚好分到了这块地址,程序就会崩溃掉。那为什么可以用assign修饰

    基本数据类型?因为基础数据类型一般分配在栈上,栈的内存会由系统自己自动处理,不会造成野指针。

4.copy.建立一个索引计数为1的对象,然后释放旧对象.使用场景:一般用于NSString,block中.

   (1)block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,可能被随时 

   回收,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序

   崩溃。通过copy可以把block拷贝(copy)到堆,保证block的声明域外使用

   (2)NSString使用copy也是怕赋值时,会有更改发生错误,具体原因可以参照一下其他的博客,这里就不多说了;

5.retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值