Вложенные фабричные методы в Objective-C - PullRequest
0 голосов
/ 22 марта 2010

Каков наилучший способ управления памятью с помощью вложенных фабричных методов, например, в следующем примере?

@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 добавляется за запрос.]

Ответы [ 2 ]

2 голосов
/ 22 марта 2010

Почему вы думаете, что пул авто-выпуска сбрасывается?

Пул авто-выпуска не сбрасывается при касании какао, если вы не сбросите его или элемент управления не вернется обратно в цикл событий.

Из Руководства по управлению памятью iPhone

Комплект приложений автоматически создает пул в начале цикла событий (или итерации цикла событий), например при нажатии мыши.событие и освобождает его в конце, так что ваш код обычно не должен беспокоиться о них.

1 голос
/ 22 марта 2010

Ошибка точно описывает проблему: вызывается copyWithZone, и он не реализован в MyClass. Проверьте атрибуты или реализацию свойства, которому оно назначено (посмотрите, копирует ли оно). Кроме того, copyWithZone будет вызываться, если экземпляр MyClass используется в качестве ключа к NSDictionary. Вот некоторая информация о реализации copyWithZone .

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