一个对象的准确类型是在分配内存空间的时候指定 ,程序员指定的类型只是让该对象有该类型的方法。
能否使用指定类的方法取决于运行时,这个对象的类型是否正确。(理解这两句句话很重要)
有可变不可变之分时:
可变 -》不可变 copy
可变 -》可变 mutableCopy
不可变 -》可变 mutableCopy
不可变 -》不可变 copy 不可变做一次copy 得到不可变 只是引用计数器+1 和strong属性一致。
总结:只要有可变都会新建副本 注意:不可变的对象不要使用copy 否则变成了不可变
自定义对象的copy (NSObect本身不支持NSCopying协议,因此子类必须遵守并实现copyWithZone方法)
@interface Person : NSObject<NSCopying>
@property(nonatomic ,copy)NSString *name;
@end
@implementation Person
-(id)copyWithZone:(NSZone *)zone
{
//Person *p = [[Person alloc]init];
Person *p = [[self.class alloc]init];//如果有子类,能保证copy出子类对象
p.name = self.name; return p;
}
@end
创建一个继承自Person得子类 实现copy操作
@interface Student :Person
@property(nonatomic,strong)NSString *num;
@end
@implementation Student
-(id)copyWithZone:(NSZone *)zone
{
Student *stu = [super copyWithZone:zone];
stu.num = self.num;
return stu;
}
@end