iOS的copy和mutableCopy

系統(tǒng)的對(duì)象

先看看我的測(cè)試代碼,一切按照事實(shí)說(shuō)話,我覺(jué)得是最有權(quán)威的。

     NSString *name = @"張三";
    //淺復(fù)制
    NSString *copyName = [name copy];
    //深復(fù)制
    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:@"中天"];
    //淺復(fù)制
    NSString *copyCompany = [company copy];
    //深復(fù)制
    NSString *mutableCompany = [company mutableCopy];
    
    NSLog(@"company = %p copyCompany = %p mutableCompany = %p", company, copyCompany, mutableCompany);
    //company = 0x600000072080 copyCompany = 0x600000035d20 mutableCompany = 0x600000072200

總結(jié):對(duì)于系統(tǒng)的對(duì)象copy出來(lái)的永遠(yuǎn)是不可變對(duì)象,mutableCopy出來(lái)的永遠(yuǎn)是可變對(duì)象。
295346-bd95431918be69b1.png

自定義對(duì)象

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

直接copy還會(huì)報(bào)錯(cuò),得實(shí)現(xiàn)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,自己就無(wú)需再次alloc內(nèi)存空間了
//    Car *car = [[Car alloc] init];
}


@end
結(jié)論:這個(gè)自定義的對(duì)象,要實(shí)現(xiàn)copy,首先遵守NSCopying協(xié)議,然后實(shí)現(xiàn)- (id)copyWithZone:(NSZone *)zone,它里頭的實(shí)現(xiàn)不一樣出的結(jié)果不一樣,return self,就不會(huì)拷貝空間,第二種的重新創(chuàng)建個(gè)對(duì)象返回肯定要分配新的空間。

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:@"中國(guó)"];
    car.city = city;
    //reason: 'Attempt to mutate immutable object with appendString:'奔潰
    [car.city appendString:@"哈哈"];

解釋一下,第一種是對(duì)的,copy的是不可變對(duì)象,即使之前的增加也不會(huì)影響到自己。第二種就是指針指到同一個(gè)地址了。之前的變化會(huì)影響到自己。最后一種本來(lái)就是錯(cuò)的,copy的是不可變對(duì)象,但是用NSMutableString來(lái)接,給人錯(cuò)覺(jué),以為真的可以加字符串,導(dǎo)致程序奔潰。

結(jié)論:一般開(kāi)發(fā)正確的寫(xiě)法是@property(nonatomic,copy)NSString *name;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容