Как написать конструктор удобства Objective-C
Я пытаюсь добавить конструктор удобства в свой пользовательский объект.
Подобно [NSArray arrayWithArray:]
Я знаю, что он включает метод класса, который возвращает объект с автоматическим выпуском. Я искал поисковые запросы, но все, что я могу найти, это определение конструктора удобства, но не как его написать.
Ответы
Ответ 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.
Просто укажите все параметры, которые вы хотите передать в конструктор.