IOS开发--第四阶段--内存管理
深拷贝与浅拷贝
只有实现了NSCoping协议的对象才能进行copy,自定义对象的copy需要实现NSCopy协议,具体是深拷贝还是浅拷贝取决于协议如何实现
copy得到的类型一定是不可变的;mutableCopy得到的类型一定是可变的
浅拷贝:拷贝过后内存地址(指针)没有改变;
深拷贝:拷贝过后内存地址(指针)发生改变;
不可变的类型进行不可变的拷贝是浅拷贝,其他都是深拷贝;只要见到mutable,都是深拷贝(不管是拷贝类型还是拷贝方法);
1)NSString: copy 浅拷贝 , 拷贝过后为 NSString 不可变;
mutableCopy 深拷贝, 拷贝过后为 NSMutableString 可变;
2)NSMutableString: copy 深拷贝 , 拷贝过后为 NSString 不可变;
mutableCopy 深拷贝 , 拷贝过后为 NSMutableString 可变;
(NSArray, NAMutableArray) (NSDictionary, NSMutableDictionary) NSSet(集合)同上类似
3)copy时顺便会附带一个Strong
4)@autoreleasepool{} 自动释放池; for循环创建一个对象就释放一个对象
5)NSAutoreleasepool *pool = [NSAutoreleasepool alloc] init];
注意:
错误代码:@property ( nonatomic,copy)NSMutableArray * mutableArray;
运用该种写法时必须重写其set放法;
正确写法:@property ( nonatomic,retain)NSMutableArray * mutableArray;
ARC
ARC中[super delloc]方法已不能调用,但delloc方法依然有效,所以依然可以 [[NSNotificationCenter defaultCenter] removeObser:self];
Strong,Weak
1)Strong为强引用,Strong指针指向的对象永不释放,没有strong指针指向它时,它会立即释放;
2)weak是弱应用,当其对象被释放时自动置为空;没有Strong和weak指针修饰的对象默认为__strong;
3)在ARC中@property retain的对象在编译是会自动编译为Strong
4)strong,weak不修饰简单类型,简单类型用assgin 或 unsafe_unretained
5)在ARC的block中,之前为防止循环引用用__block,现在用weak;
在ARC环境下添加非ARC文件:-fno- objc-arc
在非ARC环境下添加ARC文件:-fobjc-arc
拓展:
转换, 桥接
1).m OC和 C 可以直接混编;
2).m--->.mm OC与C ,C++混编时;
3) .cpp C和C++混编,不与OC混编 ;
4)__bridge_retained OC--->C 转换的时候会retain一次;(用于全局的方法,且方法必须是在.h中声明过的方法);
5)__bridge_transfer C--->OC 转换的时候会release一次;
6)__bridge C<--->OC 相互转换时引用计数不产生任何更改;(用于局部的方法,且方法必须是在.h中声明过的方法);