Создание класса без метода init (Objective-c) - PullRequest
8 голосов
/ 03 февраля 2010

Можно ли создать класс без метода init, чтобы заставить всех вызывающих абонентов создавать вместо него объект с фабричным методом?

Ответы [ 5 ]

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

Итак, вы хотите убедиться, что ваш класс никогда не инициализируется с помощью -init, верно? Вы не можете точно делать то, что хотите, но можете приблизиться.

Поскольку вы наследуете от NSObject, у вас есть метод init, и вы ничего не можете сделать, чтобы предотвратить его вызов. Тем не менее, вы можете переопределить init к этому:

- (id)init
{
   [self dealloc];
   @throw [NSException exceptionWithName:@"MyExceptionName" reason:@"Reason" userInfo:nil];
   return nil;
}

Таким образом, каждый раз, когда кто-то вызывает ваш метод -init, он убивает объект, так что практически ваш метод init практически не вызывается.

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

Если вы действительно хотите создать проблемы для пользователей вашего класса, которые используют init, вы можете сделать:

@implementation MyClass

- (id) init
{
    // Still have to make sure the runtime has initialised everything for "self"
    self = [super init];
    if (!self) return nil;
    [self release]; // some say you should use [super dealloc]
    [super doesNotRecognizeSelector:_cmd];
    return nil;
}

@end

Вы вызываете super doesNotRecognizeSelector:, потому что вы можете захотеть реализоватьваше собственное поведение для неопознанных селекторов для вашего класса.

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

Зависит. Если ваш класс унаследован от NSObject, он будет иметь унаследованный метод init (который ничего не делает с переменными вашего экземпляра). Так что в этом смысле, даже если вы действительно не хотите иметь метод init, у вас, скорее всего, все еще будет такой. Поэтому, если ваш вопрос был «Нужно ли реализовывать тривиальный метод init?», Ответ «нет, вам не нужно». Однако, если ваш вопрос был «Нужно ли мне вызывать метод init, если я не переопределил его?», Тогда ответ «да, вы делаете». Что бы вы ни делали с подклассами NSObject, в какой-то момент вам все равно нужно вызвать init после создания объекта. Таков образ жизни.

Как говорится, вы скорее всего хотите init метод, если только инициализация вашего объекта не требует ничего, кроме обнуления всего вашего объекта.

В противном случае, если вы решите , а не наследовать от NSObject или какого-либо из его подклассов и просто наследовать от ничего, это явно плохая идея, поскольку класс NSObject работает со всем Требуется время выполнения ObjC, и требования достаточно высоки, тогда у вас потенциально не будет init метода вообще . А если серьезно, не пытайтесь делать это дома.

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

NSObject реализует метод init для вас, который делает все, что он делает. Если вашему классу нечего настраивать при его создании, просто не переопределяйте метод -(id)init, предоставленный NSObject. Но вы все равно вызываете его при создании экземпляра.

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

Конечно. В Objective-C нет фактических конструкторов . Методы типа init обычно используются для инициализации класса в том же духе, что и конструктор, но они являются просто «нормальным» методом (в них нет ничего особенного, как, например, с конструкторами Java).

Тем не менее, если ваш класс не не инициализирует свои экземпляры, вы, вероятно, хотите иметь какой-то метод init.

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