Объект только инициализируется через фабричный метод (Objective-c) - PullRequest
1 голос
/ 03 февраля 2010

Я пытаюсь создать объект, который можно создать только с помощью фабричного метода. Я предотвратил использование init, вызвав исключение (см. Создание класса без метода init ). Однако это означало, что мне пришлось создать новый метод secretInit для использования в заводском методе.

//Factory method
- (URLReqs *)buildURLReq:(NSString *)location
{
    URLReqs *tmp=[[URLReqs alloc] secretInit];
    tmp.str=location
    return tmp;
}

- (id) secretInit{
    return [super init];
}

Этот метод беспорядочный, и хотя мы можем избежать объявления secretInit в заголовочном файле, кто-то может получить к нему доступ. Есть ли лучшее решение?

Одной из идей является попытка вызова init для суперобъекта URLReqs напрямую, вместо создания функции для этого.

Ответы [ 3 ]

1 голос
/ 03 февраля 2010

Вы не хотите делать это таким образом, но это возможно:


#include <objc/message.h>

@implementation MyClass

+ (id) factoryMethodWithParameter:(NSString *) someString;
{
    struct objc_super instanceSuper;
    id myInstance = [self alloc];
    instanceSuper.receiver = myInstance;
    instanceSuper.super_class = [self superclass];
//  instanceSuper.class = [self superclass]; // use this line if the above doesn't compile
    myInstance = objc_msgSendSuper (&instanceSuper, @selector(init));

    //continue on setting up myInstance's ivars . . .
    [myInstance setVariable:someString];

    return myInstance;
}

- (id) init
{
    self = [super init];
    if (!self) return nil;
    [self release];
    [self doesNotRecogniseSelector:_cmd];
    return nil;
}

@end

Это позволит вам продолжать отправлять init сообщения на myInstance s & ldquo; super & rdquo; объект, но не позволяет никому отправлять init в MyClass экземпляров.

Будьте осторожны, хотя в нем используются стандартные функции времени выполнения, объявленные в objc/*.h, не ожидайте, что Apple будет поддерживать этот API времени выполнения согласованным.

0 голосов
/ 03 февраля 2010

Он открывается только в том случае, если на него есть ссылка в заголовочном файле.

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

0 голосов
/ 03 февраля 2010

Решение - использовать категорию на вашем объекте, чтобы скрыть секретный метод инициализации.

Частные методы по категориям

Какую цель вы пытаетесь достичь? Возможно, есть лучшее решение, чем это.

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