系統(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)致程序奔潰。