ios拷贝小议
来源:互联网 发布:网络问政 编辑:程序博客网 时间:2024/05/18 21:10
1.copy vs mutableCopy
copy,对于不可变的对象,简单的指向其内存.对于可变对象,复制内存内容到新的内存中并把新的内存值赋值给左值.
mutableCopy,始终复制到新的内存中,以一个可变的类型赋值给左值.
2.copy vc retain
retain,引用计数+1,内存地址赋值给左值.
copy,对于不可变对象的,相当于retain;对于可变对象,则是深拷贝赋值.
举例:
NSString* a = [NSString stringWithFormat:@"%@",@"this is a"]; NSString* b = [a copy]; NSString* bb = [a retain]; NSString* cc = [a mutableCopy];//实际上cc应该是NSMutableString类型 NSLog(@"%d,%d,%d,%d",[a retainCount],[b retainCount],[bb retainCount],[cc retainCount]);//输出3,3,3,1
NSMutableString* a = [NSMutableString stringWithFormat:@"%@",@"this is a"]; NSString* b = [a copy];//不可变的b NSString* bb = [a retain];//实际类型是NSMutableString的bb NSString* cc = [a mutableCopy];//同上 NSLog(@"%d,%d,%d,%d",[a retainCount],[b retainCount],[bb retainCount],[cc retainCount]);//输出2,1,2,1
3.一些问题
通过上面2点,思考下面的问题
我们通常如果这样定义一个变量
@property(nonatomic,copy) NSMutableString* mString;
然后这样使用
@synthesize mString;NSMutableString* a = [NSMutableString stringWithFormat:@"%@",@"this is a"];self.mString = a;[mString insertString:@"m-" atIndex:0];
能通过么?当然不能,赋值后的mString是NSString类型的,不可变.如果需要可以改变就需要自己定义属性函数.
-(void)setMString:(NSMutableString *)m{ mString = [m mutableCopy];}-(NSMutableString *)mString{ return mString;}
(当然,NSMutableString不是线程安全的,一般都建议私有之:@private;或者一定要用的话以NSString作为对外接口类型)
4.NSCopying NSMutableCopying NSCopyObjective()
NSCopying就是复制一个对象
NSMutableCopying就是深拷贝一个对象,让两个对象的改变互不影响
(其实上面着两个完全看你怎么写啦)
NSCopyObject(self,0,zone)就是简单的赋值=
(在涉及到ns对象的时候,NSCopyObject不建议使用)
注意看下面一个例子:
@interface ClassB : NSObject <NSCopying>{ NSString* stringB;}@property(nonatomic,copy) NSString* stringB;@end
-(id)copyWithZone:(NSZone *)zone{ ClassB *b = NSCopyObject(self, 0, zone);// 使用NSCopyObject时的正确赋值方法,因为没有涉及到原来的内存指针什么事 b->stringB = @"what";// 看看被注释的这个错误方法,由于setter方法的特性,原来的stringB指向的内存的retainCount减一// 而由于NSCopyObject的特性,两者又是指向同一个地址的,所以,原类中stirngB指向的地址已经释放了,之后你dealloc中在释放一次?!.就出错啦// b.stringB = @"what"; return b;}
参考:http://stackoverflow.com/questions/2002174/copy-mutablecopy
http://stackoverflow.com/questions/4995254/nsmutablestring-as-retain-copy
http://robnapier.net/blog/implementing-nscopying-439#comment-1312
注释:可变对象mutable比如NSMutableString,NSMutableArray等
不可变对象immutable比如NSString,NSArray等
- ios拷贝小议
- ios拷贝小议
- 小议iOS------block传值 回调传值
- IOS 拷贝
- 小议ios内存管理与属性【转】
- iOS伪拷贝, 浅拷贝, 深拷贝
- [ios]深拷贝,浅拷贝
- iOS深拷贝浅拷贝
- ios深浅拷贝学习
- ios 深浅拷贝学习
- ios 深浅拷贝学习
- ios 深浅拷贝学习
- iOS深浅拷贝
- ios 深浅拷贝学习
- ios 深浅拷贝学习
- ios 深浅拷贝学习
- ios 深浅拷贝学习
- ios之深拷贝
- 选择开发游戏引擎
- iOS应用开发应遵循的10条设计原则
- spring 定时任务(自动同步数据)
- javascript的定时器
- 使用游標的一個存儲過程
- ios拷贝小议
- js中masonry与infinitescroll结合
- 【Ubuntu手记】64位Ubuntu11.10下 eclipse配置Android开发环境所遇到的问题
- 排序算法
- java程序员面试必备的32个要点
- Lucene3.1对QueryParser做了调整
- uva 146 - ID Codes
- D3D学习笔记(初始化Direct3D)
- 内部UML培训文件,欢迎大家批评指正