美文网首页
iOS的copy和mutableCopy

iOS的copy和mutableCopy

作者: charlotte2018 | 来源:发表于2017-07-11 14:20 被阅读23次

系统的对象

先看看我的测试代码,一切按照事实说话,我觉得是最有权威的。

     NSString *name = @"张三";
    //浅复制
    NSString *copyName = [name copy];
    //深复制
    NSMutableString *mutableName = [name mutableCopy];
    
    NSLog(@"name = %p copyName = %p mutableName = %p", name, copyName, mutableName);
    
    // name = 0x108ff6068 copyName = 0x108ff6068 mutableName = 0x60000006dbc0
    
    NSMutableString *company = [[NSMutableString alloc]initWithString:@"中天"];
    //浅复制
    NSString *copyCompany = [company copy];
    //深复制
    NSString *mutableCompany = [company mutableCopy];
    
    NSLog(@"company = %p copyCompany = %p mutableCompany = %p", company, copyCompany, mutableCompany);
    //company = 0x600000072080 copyCompany = 0x600000035d20 mutableCompany = 0x600000072200

总结:对于系统的对象copy出来的永远是不可变对象,mutableCopy出来的永远是可变对象。
295346-bd95431918be69b1.png

自定义对象

   Car *car = [[Car alloc]init];
   car.name = @"迈腾";
    //, reason: '-[Car copyWithZone:]: unrecognized selector sent to instance 0x6000000090b0'
   Car *copyCar = [car copy];

直接copy还会报错,得实现copyWithZone方法。

#import "Car.h"

@interface Car() <NSCopying>

@end

@implementation Car

- (id)copyWithZone:(NSZone *)zone
{
    return self;
}

- (id)copyWithZone:(NSZone *)zone
{
    Car *car = [[Car allocWithZone:zone] init];
    return Car;

// 有些人可能下面alloc,重新初始化空间,但这方法已给你分配了zone,自己就无需再次alloc内存空间了
//    Car *car = [[Car alloc] init];
}


@end
结论:这个自定义的对象,要实现copy,首先遵守NSCopying协议,然后实现- (id)copyWithZone:(NSZone *)zone,它里头的实现不一样出的结果不一样,return self,就不会拷贝空间,第二种的重新创建个对象返回肯定要分配新的空间。

property里NSString用什么修饰copy OR strong

我想了三种情况:

@interface Car : NSObject

@property(nonatomic,copy)NSString *name;
@property(nonatomic,strong)NSString *company;
@property(nonatomic,copy)NSMutableString *city;

@end
   Car *car = [[Car alloc]init];
    NSMutableString *name = [NSMutableString stringWithString:@"王"];
    car.name = name;
    [name appendString:@"哈哈"];
    //2017-07-11 14:10:02.434 copy[7295:219183] 王
    NSLog(@"%@",car.name);
    
    NSMutableString *company = [NSMutableString stringWithString:@"中天"];
    car.company = company;
    [company appendString:@"哈哈"];
    //2017-07-11 14:12:39.283 copy[7364:221097] 中天哈哈
    NSLog(@"%@",car.company);
    
    NSMutableString *city = [NSMutableString stringWithString:@"中国"];
    car.city = city;
    //reason: 'Attempt to mutate immutable object with appendString:'奔溃
    [car.city appendString:@"哈哈"];

解释一下,第一种是对的,copy的是不可变对象,即使之前的增加也不会影响到自己。第二种就是指针指到同一个地址了。之前的变化会影响到自己。最后一种本来就是错的,copy的是不可变对象,但是用NSMutableString来接,给人错觉,以为真的可以加字符串,导致程序奔溃。

结论:一般开发正确的写法是@property(nonatomic,copy)NSString *name;

相关文章

  • iOS开发之copy

    iOS中copy有两种copy和mutableCopy

  • copy与mutablecopy使用对比

    杂七杂八 copy和mutableCopy都是浅拷贝!!!iOS中的copy,mutableCopy,深拷贝和浅拷...

  • iOS 内存(系统引用的技术)了解

    iOS程序的内存布局 Tagged Pointer OC对象的内存管理 copy和mutableCopy

  • 【iOS】copy和mutableCopy

    NSString NSString copy 没有生成新的字符串 NSString mutableCopy 生成了...

  • iOS copy和mutableCopy

    一、copy (1)用copy修饰的 或者赋值的 变量肯定是不可变的。 (2)用copy赋值,要看源对象是否是可变...

  • iOS copy和mutableCopy

    经测试得出如下结论:【测试代码和测试结果见后面】 不管是非集合类对象,还是集合类对象,执行copy之后的对象,不管...

  • iOS copy和mutableCopy

    心得:不管是copy还是mutableCopy,目的都是拷贝出来一个新的对象,并且值都不变。 由于值不变所以: 只...

  • iOS copy 和 mutableCopy

    copy 和mutableCopy 这种老生常谈的问题,还是得掰扯掰扯 之前在我们的意识当中 copy 和muta...

  • iOS开发深拷贝与浅拷贝的关系

    IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解 copy与retain的区别: copy是创建...

  • copy和mutableCopy

    copy和mutableCopy copy只会产生不可变的副本对象(比如NSString) mutableCopy...

网友评论

      本文标题:iOS的copy和mutableCopy

      本文链接:https://www.haomeiwen.com/subject/bqxmhxtx.html