2013-11-21 2 views
2

Я видел два разных способа реализации copyWithZone. Разные?Глубокая копия - эти две реализации copyWithZone разные?

первый код:

@interface Person : NSObject <NSCopying> 

@property (nonatomic,weak) NSString *name; 
@property (nonatomic,weak) NSString *surname; 
@property (nonatomic,weak) NSString *age; 

-(id) copyWithZone:(NSZone *)zone; 

@end 

//and 1st implementation 
@implementation Person 
-(id) copyWithZone:(NSZone *)zone 
{ 
Person *copy = [[self class] allocWithZone:zone]; 
copy.name = self.name; //should we use copy.name=[self.name copyWithZone: zone]; ? 
copy.age = self.age; 
copy.surname = self.surname; //here we make assignment or copying? 
return copy; 
} 
@end 

и второй код

@interface YourClass : NSObject <NSCopying> 
{ 
    SomeOtherObject *obj; 
} 

// In the implementation 
-(id)copyWithZone:(NSZone *)zone 
{ 
    // We'll ignore the zone for now 
    YourClass *another = [[YourClass alloc] init]; 
    another.obj = [obj copyWithZone: zone]; 

    return another; 
} 

Если они различны, что из них более правильный? 1. Я смутился с [self class] в 1-м. Я знаю о метаклассах в объекте c, но нужно ли это в этом фрагменте кода? 2. copy.name = self.name; vs another.obj = [obj copyWithZone: zone] В чем разница между вышеупомянутым?

ответ

2
  1. Незначительные свойства строки - это не очень хорошая идея, это означает, что кто-то еще держит ссылку на вашу строку, иначе она будет освобождена.

обычно работает на жидком его хорошая идею, чтобы сделать NSString * Свойство а копии свойства, так:

@interface Person : NSObject <NSCopying> 

@property (nonatomic,copy) NSString *name; 

... 

//and 1st implementation 
@implementation Person 
-(id) copyWithZone:(NSZone *)zone 
{ 
Person *copy = [[self class] allocWithZone:zone]; 
copy.name = self.name; //assigning here is same as coping, should be enough 

А:

[self class] 

В этом случае не мета класса, только класс и этот вызов копии будут полиморфными и могут использоваться в подклассах Person. В противном случае копия всегда будет возвращать Личность, не имеет значения, какая будет вызвана копия метода подкласса.

copy.name = self.name; 

против

another.obj = [obj copyWithZone: zone] 

Первый случай присвоения собственности - как он обрабатывается в зависимости от типа недвижимости. В случае копирования - эти два выражения одинаковы. Второй случай - все в порядке, учитывая, что SomeOtherObject также реализует глубокую копию.

https://developer.apple.com/library/mac/documentation/general/conceptual/devpedia-cocoacore/ObjectCopying.html

 Смежные вопросы

  • Нет связанных вопросов^_^