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中声明过的方法);

 

posted on 2015-03-25 10:39  shuqian  阅读(338)  评论(0编辑  收藏  举报

导航