Как написать удобный конструктор Objective-C - PullRequest
19 голосов
/ 13 августа 2011

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

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

Ответы [ 2 ]

33 голосов
/ 13 августа 2011

Допустим, у вас есть следующее:

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

Затем, чтобы добавить фабричный метод, вы должны изменить его на следующее:

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

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

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

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

4 голосов
/ 13 августа 2011

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

@implementation SomeObject

@synthesize string = _string; // assuming there's 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...