Подтвердить что ты не робот

Как написать конструктор удобства Objective-C

Я пытаюсь добавить конструктор удобства в свой пользовательский объект. Подобно [NSArray arrayWithArray:]

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

4b9b3361

Ответ 1

Скажем, у вас есть следующее:

@class PotatoPeeler : NSObject
- (instancetype)initWithWidget: (Widget *)w;
@end

Затем, чтобы добавить метод factory, вы должны изменить его на это:

@class PotatoPeeler : NSObject
+ (instancetype)potatoPeelerWithWidget: (Widget *)w;
- (instancetype)initWithWidget: (Widget *)w;
@end

И ваша реализация будет просто следующей:

+ (instancetype)potatoPeelerWithWidget: (Widget *)w {
    return [[[self alloc] initWithWidget: w] autorelease];
}

Изменить: заменить id на instancetype. Они функционально идентичны, но последний дает лучшие подсказки компилятору о типе возвращаемого метода.

Ответ 2

Как правило, мой подход следующий: сначала я создаю обычный метод инициализации (метод экземпляра), затем создаю метод класса, который вызывает обычный инициализатор. Мне кажется, Apple использует тот же подход большую часть времени. Пример:

@implementation SomeObject

@synthesize string = _string; // assuming there an 'string' property in the header

- (id)initWithString:(NSString *)string 
{
   self = [super init];
   if (self)
   {
      self.string = string;
   }
   return self;
}

+ (SomeObject *)someObjectWithString:(NSString *)string
{
   return [[[SomeObject alloc] initWithString:string] autorelease];
}

- (void)dealloc
{
   self.string = nil;

   [super dealloc];
}

@end

Ответ 3

-(MYClass*) myInit{
    self = [super init];

    /* Your code */

    return self;
}

Предполагая, что вы вывели свой класс из NSObject.

Просто укажите все параметры, которые вы хотите передать в конструктор.