Я немного запутался в правильном способе поддержки моего класса механикой 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