手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:拷贝

转:ios拷贝小议

纯记录,目前我还没有学到这里。
看到这样的文章,就先记录下来,以后不怕网址不在了。。。

1.copy vs mutableCopy

copy,对于不可变的对象,简单的指向其内存.对于可变对象,复制内存内容到新的内存中并把新的内存值赋值给左值.

mutableCopy,始终复制到新的内存中,以一个可变的类型赋值给左值.

大小: 47.27 K
尺寸: 471 x 278
浏览: 1482 次
点击打开新窗口浏览全图

2.copy vc retain

retain,引用计数+1,内存地址赋值给左值.

copy,对于不可变对象的,相当于retain;对于可变对象,则是深拷贝赋值.

C++代码
  1. NSString* a = [NSString stringWithFormat:@"%@",@"this is a"];  
  2.   
  3. NSString* b = [a copy];  
  4.   
  5. NSString* bb = [a retain];  
  6.   
  7. NSString* cc = [a mutableCopy];//实际上cc应该是NSMutableString类型  
  8.   
  9. NSLog(@"%d,%d,%d,%d",[a retainCount],[b retainCount],[bb retainCount],[cc retainCount]);  
  10.   
  11. 3,3,3,1  
  12.   
  13. NSMutableString* a = [NSMutableString stringWithFormat:@"%@",@"this is a"];  
  14.   
  15. NSString* b = [a copy];//不可变的b  
  16.   
  17. NSString* bb = [a retain];//实际类型是NSMutableString的bb  
  18.   
  19. NSString* cc = [a mutableCopy];//同上  
  20.   
  21. NSLog(@"%d,%d,%d,%d",[a retainCount],[b retainCount],[bb retainCount],[cc retainCount]);  
  22.   
  23. 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等


-----EOF--
原文来自:http://www.cnblogs.com/v2m_/archive/2011/10/12/2208684.html
作者:v2m

Tags: ios, 拷贝