zoukankan      html  css  js  c++  java
  • ios拷贝小议

    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等
  • 相关阅读:
    CentOS实验六:配置EPEL软件源
    Linux 目录结构【转】
    man page中的数字
    Linux常用命令(一) 基础
    MVP大礼包写真集
    DNN单击事件只有在"编辑"状态下才有效的解决方案
    GridView导出到Excel和开源图表工具
    免费的DNN工具条
    在应用程序级别以外使用注册为 allowDefinition='MachineToApplication' 的节是错误的解决办法
    DotNetNuke 4.9.0安装完全教程
  • 原文地址:https://www.cnblogs.com/v2m_/p/2208684.html
Copyright © 2011-2022 走看看