浅谈:深.浅拷贝与copy.strong
深.浅拷贝
- copy mutableCopy NSString
NSString *string = @"汉斯哈哈哈";
// 没有产生新对象
NSString *copyString = [string copy];
// 产生新对象
NSMutableString *mutableCopyString = [string mutableCopy];
NSLog(@"string = %p copyString = %p mutableCopyString = %p", string, copyString, mutableCopyString);
- copy mutableCopy NSMutableString
NSMutableString *string = [NSMutableString stringWithString:@"汉斯哈哈哈"];
// 产生新对象
NSString *copyString = [string copy];
// 产生新对象
NSMutableString *mutableCopyString = [string mutableCopy];
NSLog(@"string = %p copyString = %p mutableCopyString = %p", string, copyString, mutableCopyString);
结论:
注意:其它对象NSArray、NSMutableArray 、NSDictionary、NSMutableDictionary一样适用
- copy NSObject
HSPerson *p = [[HSPerson alloc] init];
p.age = 20;
p.height = 170.0;
HSPerson *copyP = [p copy]; // 这里崩溃
崩溃:
看崩溃信息HSPerson应该先实现:
- (id)copyWithZone:(NSZone *)zone;
測试:
#import "HSPerson.h"
@interface HSPerson()<NSCopying>
@end
@implementation HSPerson
- (id)copyWithZone:(NSZone *)zone
{
return @"汉斯哈哈哈";
}
@end
HSPerson *p = [[HSPerson alloc] init];
p.age = 20;
p.height = 170.0;
HSPerson *copyP = [p copy];
NSLog(@"copyP: %@", copyP);
能够看出copyWithZone又一次分配新的内存空间。则:
- (id)copyWithZone:(NSZone *)zone
{
HSPerson *person = [[HSPerson allocWithZone:zone] init];
return person;
// 有些人可能以下alloc,又一次初始化空间,但这方法已给你分配了zone,自己就无需再次alloc内存空间了
// HSPerson *person = [[HSPerson alloc] init];
}
HSPerson *p = [[HSPerson alloc] init];
p.age = 20;
p.height = 170.0;
HSPerson *copyP = [p copy];
NSLog(@"p = %p copyP = %p", p, copyP);
NSLog(@"age = %d height = %f", copyP.age, copyP.height);
尽管copy了份新的对象,然而age,height值并未copy,那么:
- (id)copyWithZone:(NSZone *)zone
{
HSPerson *person = [[HSPerson allocWithZone:zone] init];
person.age = self.age;
person.height = self.height;
// 这里self事实上就要被copy的那个对象,非常显然要自己赋值给新对象。所以这里能够控制copy的属性
return person;
}
这时你会想。有NSMutableCopying?没错,是有这货:
- (id)mutableCopyWithZone:(NSZone *)zone
{
HSPerson *person = [[HSPerson allocWithZone:zone] init];
person.age = self.age;
person.height = self.height;
return person;
}
NSCopying、NSMutableCopying有啥差别?
事实上感觉不是必需有NSMutableCopying,由于压根就没可变的HSPerson,但假设该对象有其它行为,能够借用NSMutableCopying实现,哈哈哈
copy.strong
说完深浅拷贝。理解copy.strong就轻松多了!
- copy
#import <Foundation/Foundation.h>
@interface HSPerson : NSObject
@property (nonatomic, copy) NSString *name;
@end
NSMutableString *string = [NSMutableString stringWithFormat:@"汉斯哈哈哈"];
HSPerson *person = [[HSPerson alloc] init];
person.name = string;
// 不能改变person.name的值,由于其内部copy新的对象
[string appendString:@" hans"];
NSLog(@"name = %@", person.name);
property copy 实际上就对name干了这个:
- (void)setName:(NSString *)name
{
_name = [name copy];
}
如果name为NSMutableString。会发生什么事?
@property (nonatomic, copy) NSMutableString *name;
这样会挨骂哦,实际上内部还是:
- (void)setName:(NSMutableString *)name
{
_name = [name copy];
}
copy出来的仍然是不可变字符。假设有人用NSMutableString的方法,就会崩溃:
- strong
@property (nonatomic, strong) NSString *name;
NSMutableString *string = [NSMutableString stringWithFormat:@"汉斯哈哈哈"];
HSPerson *person = [[HSPerson alloc] init];
person.name = string;
// 能够改变person.name的值,由于其内部没有生成新的对象
[string appendString:@" hans"];
NSLog(@"name = %@", person.name);
总结:用copy与strong取决于需求。假设不希望被外界更改用copy。反之用strong