Каков наилучший способ управления памятью с помощью вложенных заводских методов, например, в следующем примере?Вложенные заводские методы в Objective-C
@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
Проблема здесь (я думаю), что autorelease бассейн очищается перед методами SpecialCaseN вернуться к своим абонентам [Edit: по-видимому, нет - см комментарии ниже]. Следовательно, конечный вызывающий агент SpecialCaseN не может полагаться на результат, который был сохранен. (Я получаю «[MyClass copyWithZone:]: непризнанный селектор, отправленный экземпляру 0x100110250» при попытке присвоить результат [MyClass SpecialCase1] свойству на другом объекте.)
Причина, по которой требуется использование фабричных методов SpecialCaseN, заключается в том, что в моем фактическом проекте есть несколько параметров, необходимых для инициализации экземпляра, и у меня есть предопределенный список «модельных» экземпляров, которые я хотел бы легко создавать.
Я уверен, что есть лучший подход, чем это.
[Edit:. @interface добавлено в запрос]
Можете ли вы разместить интерфейс для MyClass? (Кроме того, я бы написал метод dealloc для этого класса, хотя бы для полноты) –
Выполнено. (Это упрощенный пример, адаптированный из моего фактического класса, который взрывается.) – StephenT