Внедрение NSCopy - PullRequest
       5

Внедрение NSCopy

0 голосов
/ 23 октября 2010

Я немного запутался в правильном способе поддержки моего класса механикой NSCopy, и я надеюсь, что кто-то может помочь мне разобраться.

Большой вопрос заключается в следующем: если мой класспо большей части неизменный, за исключением свойства коллекций, когда я реализую метод copyWithZone с помощью наследования NSCopy, нужно ли мне делать версию, в которой я возвращаю self, для которого было вызвано retain, например:

- (id)copyWithZone:(NSZone *)zone 
{
     return [self retain];
}

или мне нужно сделать другую версию, которая принимает во внимание политики, используемые NSCopyObject, как указано в руководстве по программированию управления памятью, опубликованном Apple?(Я читал несколько постов о том, насколько опасен NSCopyObject, поэтому нужно быть осторожным с их реализациями).

- (id)copyWithZone:(NSZone *)zone
{
    NSCell *cellCopy = NSCopyObject(self, 0, zone);
    /* Assume that other initialization takes place here. */
    cellCopy->image = nil;
    [cellCopy setImage:[self image]];
    return cellCopy;
}

В моем классе есть ивары, представляющие собой смесь примитивных типов, типов объектов и NSArray.коллекция.Я предполагаю, что класс должен быть неизменным в том смысле, что клиенты не могут изменять какие-либо внутренние свойства после того, как класс был создан изначально, но в какой-то момент клиент получит дополнительные связанные данные, которые необходимо добавить в класс.Кроме того, когда клиенты держатся за экземпляр, он должен иметь свою собственную копию вместо того, чтобы делиться ею, так что это экземпляр глубокой копии, а не мелкая копия.

Код:

@interface MySampleClass : NSObject {
NSString *myName;
NSString *myTitle;
BOOL     isAFlag;

NSArray *aListOfProperites; // collection holds objects of another class named 'MySampleProperty'
}

@property (nonatomic, copy, readonly) NSString *myName;
@property (nonatomic, copy, readonly) NSString *myTitle;
@property (nonatomic, readonly) BOOL isAFlag;

@property (nonatomic, copy, readonly) NSArray *aListOfProperties;

-(id)initWithNameTitleAndFlag:(NSString *)aName title:(NSString *)aTitle flag:(BOOL)aFlag;

-(void)addProperty:(MySampleProperty *)aProperty;
@end

@implementation MySampleClass

-(id)initWithNameTitleAndFlag:(NSString *)aName title:(NSString *)aTitle flag:(BOOL)aFlag
{
    self = [super init];
    if (nil != self)
    {
       [self setMyName:aName];
       [self setMyTitle:aTitle];
       [self setAFlag:aFlag];
    }
    return self;
}

// all of my object setters do a 'copy' instead of retain or assign
-(void)setMyName:(NSString *)aNewName
{
if (aNewName != myName) 
{
     [myName release];
     myName = [aNewName copy];
}
}
- (id)copyWithZone:(NSZone *)zone
{
// do I do a simple retain on the object or follow NSCopyObject policies?
}

@end

1 Ответ

1 голос
/ 23 октября 2010

Если бы ваш класс был полностью неизменным, я бы предложил мелкую копию. Однако, поскольку это не так, вам придется делать глубокое копирование, чтобы избежать ошибок (если что-то делает неглубокую копию вашего класса, ожидает глубокую копию, а затем изменяет ее, исходный объект изменится а также, когда кажется, что это не так). Сделайте глубокую копию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...