Каков наилучший способ управления памятью с помощью вложенных фабричных методов, например, в следующем примере?
@interface MyClass : NSObject {
int _arg;
}
+ (MyClass *) SpecialCase1;
+ (MyClass *) SpecialCase2;
+ (MyClass *) myClassWithArg:(int)arg;
- (id) initWithArg:(int)arg;
@property (nonatomic, assign) int arg;
@end
@implementation MyClass
@synthesize arg = _arg;
+ (MyClass *) SpecialCase1
{
return [MyClass myClassWithArg:1];
}
+ (MyClass *) SpecialCase2
{
return [MyClass myClassWithArg:2];
}
+ (MyClass *) myClassWithArg:(int)arg
{
MyClass *instance = [[[MyClass alloc] initWithArg:arg] autorelease];
return instance;
}
- (id) initWithArg:(int)arg
{
self = [super init];
if (nil != self) {
self.arg = arg;
}
return self;
}
@end
Проблема здесь (я думаю) состоит в том, что пул автоматического выпуска сбрасывается перед методами SpecialCaseNвернуться к своим абонентам [Редактировать: очевидно, нет - см. комментарии ниже].Следовательно, конечный пользователь SpecialCaseN не может полагаться на сохраненный результат.(Я получаю «[MyClass copyWithZone:]: нераспознанный селектор, отправленный экземпляру 0x100110250» при попытке присвоить результат [MyClass SpecialCase1] свойству другого объекта.)
Причина, по которой требуется фабричные методы SpecialCaseNв том, что в моем реальном проекте есть несколько параметров, необходимых для инициализации экземпляра, и у меня есть предопределенный список «модельных» экземпляров, которые я хотел бы иметь возможность легко создавать.
Яуверен, что есть лучший подход, чем этот.
[Редактировать: @interface добавляется за запрос.]