IOS学习之strong-weak,assign,nonatomic关键字整理

来源:互联网 发布:java 编码url 空格 20 编辑:程序博客网 时间:2024/04/30 00:49
    作为一个初学者,对于类属性理解得很不深入,所以经常忘了像strong/weak这些关健字的作用是什么,就算知道了作用,但是时间一长就给忘了,其实就是不知道什么时候该用哪个。查阅了网上的资料后,做一个整理如下:


atomic : Objectiv-C 中使用的一种线程保护技术,可以防止在写未完成的时候被领养一个线程读取,造成数据错误。不过这种机制会耗费系统资源。所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么应该选择nonatomic属性。

nonatomic :非原子性访问,不加同步,多线程并发访问会提高性能,如果不加此属性,则默认是两个访问方法都为原子型事务访问。

这里理解得不大好,因为没用过多线程。

assign : 简单赋值,不更改索引计数,多用在基础数据类型和C数据类型。

retain :  先释放旧的对象,然后引用计数+1。

assign和retain的区别:

    首先,如果我们用malloc分配了一块内存,并且把它的地址赋给指针a,后面还想用指针b来共享这块内存,即把a赋值(assign)给b,此时a和b指向同一块内存。那么这时候如果a不再需要此内存,还不能直接释放该内存,因为如果a释放了,b还指向内存,这时候去调用b则会发生程序crash。

    上面描述的这个问题可以这么解决:我们使用一个引用计数(reference counting),我们给指针a指向的内存设定一个引用计数,当内存被分配并且赋给指针a时,引用计数记为1,当把a赋值给b时引用计数增加到2。这时如果a不再需要使用这块内存,它只需要把引用计数减1,表明自己不再拥有这块内存。b不再使用这块内存时也把计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。


strong-weak

strong : 强变量,这个比较有意思。在xcode4.2之后出来的。举个例子就能明白:

Fraction  *f1 = [[Fraction alloc] init];

Fraction  *f2 = [[Fraction alloc] init];

当使用手工内存管理时,如果直接f2 = f1,那么会导致f2指向的实例丢失但又没释放内存,所以会出现内存泄露的现象。

但是如果使用ARC,而且f1和f2的属性都是strong,那么f2 = f1会被执行成这样:

[f1 retain]

[f2 release]

f2 = f1;

这些是编译器完成的,我们看不到。这样一来就避免出现内存泄露的问题。


weak :弱变量,这个主要是用于解决循环保持问题而存在的。

当两个强变量互相拥有彼此的引用时,就构成了一个循环保持,如果对象仍然有引用,系统将不能销毁这个对象。一个很典型的例子就是在UIView中,主视图拥有子视图时,子视图的变量要设置为weak属性,这样在主视图被销毁之后,子视图的弱变量会自动被设置为nil。


_ _strong 和_ _ weak

两个都是关键字,可以用于变量的声明中,用于表明强变量和弱变量。



以上均为网上资料的整理,以自己理解的形式写出来。要明白这些,最关键的还是得理解手工内存计数。




0 0
原创粉丝点击