对一些修饰符进行整理
1.atomic原子操作,提供多线程安全,setter方法会发生变化;
基本来讲是防止在写未完成的时候被另外一个线程读取,造成数据错误,但是这种操作的弊端就是非常消耗内存资源,苹果手机的内存资源相当宝贵,所以没有使用多线程间的通讯编程,一般使用nonatomic。
2.如果没有指定nonatomic,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单的返回这个值而不会释放。
assign、retain、copy
NSString * house = [[NSString alloc] initWithFormat:@"The house is mine"];
首先在堆上分配一段内存来存储@"The house is mine", 假设内存地址为:0X000 内容则为:@"The house is mine"
然后在栈上分配一段内存存储house,假设地址为0XFFFF,内容就是0X0000。
(堆上放string的值【the house is mine】,栈上存堆上存的string值的内存地址)
1、assign:
NSString * myHouse = [house assign];
此时house和myHouse完全相同,地址都为0XFFFF,内容为0X0000,也就是说myHouse只是house的一个别名,对任何一个操作就等于对另一个操作,因此retainCount不需要增加。
2、retain:
NSString * myHouse = [house retain];
House的一切都没变,只是多了一个myhouse来存house的地址
此时myHouse的地址不再是0XFFFF,可能是0XEEEE,但内容为0X0000,所以说house和myHouse都可以管理"The house is mine"所在的内存,因此retainCount需要增加1,
3、copy:
NSString * myHouse = [house copy];
此时会在堆上重新开辟一段内存存放@"The house is mine",假设内存地址为:0X1111,内容则为:@"The house is mine"
同时会在栈上为myHouse分配内存,假设地址为:0XBBBB,内容为:0X1111,也就是说myHouse是一个新的对象,与house没有任何关系,很明显,retainCount增加1,
strong与weak
ARC 是编译器特性,ARC 的规则非常简单:只要还有一个变量指向对象,对象就会保持在内存中。当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放。这条规则对于实例变量、synthesize属性、局部变量都是适用的。OC不同于Java的地方就是没有垃圾回收机制,在内存管理这块,cocoa引入了一种称为引用计数(reference counting)的技术,有时也叫保留计数,每个对象有一个与之对关联的整数,称作它的引用计数器或保留计数器.当某段代码要访问一个对象的时候,该代码将该对象的保留计数值加1,表示”我要访问该对象”,当这段代码结束对象访问时,将对象的保留计数值减1,表示它不再访问该对象,当保留计数值为0时,表示不再有代码访问对象了,对象被销毁,其占用的内存被系统回收。
网友评论