Возможно ли создать класс без метода init, чтобы заставить всех вызывающих пользователей создать объект с использованием фабричного метода?Создание класса без метода init (Objective-c)
ответ
Итак, вы хотите убедиться, что ваш класс никогда не инициализирован с использованием -init, правильно? Вы не можете сделать точно, что вы хотите сделать, но вы можете приблизиться.
Поскольку вы наследуете NSObject, у вас есть метод init, и вы ничего не можете сделать, чтобы предотвратить его вызов.Тем не менее, вы можете переопределить инициализации для этого:
- (id)init
{
[self dealloc];
@throw [NSException exceptionWithName:@"MyExceptionName" reason:@"Reason" userInfo:nil];
return nil;
}
Таким образом, в любое время кто-то называет свой метод -init, он убивает объект, поэтому с практической точки зрения, ваш метод инициализации довольно много не-отозваны.
Имеет ли объект-c нечто вроде не реализованного исключения? – Casebash
На самом деле вам не нужно возвращать в конце - он никогда не будет достигнут – Casebash
Объектив-C является исключением-недружественным, поскольку он может вызывать утечку объектов повсюду (поскольку их вызовы 'release' никогда не могут быть достигнуты) , Если вы не используете собранную мусором время выполнения, как ни грустно это звучит, вам лучше не использовать их. – zneak
Несомненно. В Objective-C нет фактических конструкторов. init
Методы типа обычно используются для инициализации класса в том же духе, что и конструктор, но они просто «нормальный» метод (нет ничего особенного в них, например, с конструкторами Java).
Тем не менее, если ваш класс не делает не инициализации для его экземпляров, вы, вероятно, хотите , чтобы иметь какой-то init
метода.
NSObject
использует метод init
, который делает то, что он делает. Если вашему классу нечего настраивать при его создании, просто не переопределяйте метод -(id)init
, предоставляемый NSObject
. Но вы все еще называете это, когда создаете экземпляр.
Зависит. Если у вас наследуется класс от NSObject
, он будет иметь унаследованный метод init
(который ничего не делает для ваших переменных экземпляра). Таким образом, в этом смысле, даже если вы действительно не хотели иметь метод init
, у вас, скорее всего, есть его. Поэтому, если ваш вопрос: «Нужно ли мне реализовать тривиальный метод init
?», Ответ «нет, вам не нужно». Однако, если ваш вопрос: «Нужно ли мне называть метод init
, если я его не переопределял?», Тогда ответ «да, вы делаете». Что бы вы ни делали с подклассами NSObject, в какой-то момент вам все равно нужно вызвать init
после создания объекта. Таков образ жизни.
Это, пожалуйста, вы скорее всего хотите, чтобы метод init
, если ваша инициализация объекта не требует ничего, кроме обнуления всего объекта.
В противном случае, если вы решите не наследоваться от NSObject
или любого из его подклассов и просто наследуют из ничего, что явно плохая идея, потому что от того, как NSObject
класса занимается все время выполнения ObjC должен сделать а требования довольно высоки, тогда вы, возможно, окажетесь без init
метода вообще. Но серьезно, не пробуйте это дома.
Если вы действительно хотите, чтобы вызвать проблемы для пользователей вашего класса, которые используют 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
«s doesNotRecognizeSelector:
, потому что вы можете реализовать свое поведение для непризнанных селекторов твой класс.
- 1. Назначение ObjectiveC и init?
- 2. Создание одноэлементного класса без использования статического метода
- 3. Инициализированная переменная экземпляра без использования метода «init»?
- 4. Создание метода класса
- 5. NSInvocationOperation init возвращает метод вызова метода nil из метода класса
- 6. проверка параметров метода init
- 7. Использовать данные из класса без нового Init
- 8. методы Переопределение класса в ObjectiveC
- 9. Тестирование загрузки класса в ObjectiveC
- 10. Создание и вызов метода класса
- 11. Создание обратного вызова метода класса
- 12. Создание шаблона метода шаблона класса
- 13. Создание класса без макета
- 14. Константы доступа в классе без создания экземпляра класса в ObjectiveC
- 15. Как запретить наследование метода init?
- 16. Создание синглтона и переопределение метода класса Alloc
- 17. Ошибка метода init
- 18. Инициализация переменной внутри функции внутри метода класса init()
- 19. Получить имя класса Ruby без метода класса
- 20. Вызов статического метода класса БЕЗ класса, PHP
- 21. инициализации класса без __init__ метода
- 22. вызов метода из класса без его экземпляра
- 23. создание экземпляра метода класса из onCreate
- 24. создание формы django по init
- 25. Создание некорректного нетемплифицированного метода шаблонного класса
- 26. Создание экземпляра класса без «нового»
- 27. создание класса без файла xib
- 28. Создание объекта без существующего класса
- 29. Создание zip-файлов в ObjectiveC для iPhone
- 30. Init NSMutableArray объекта класса
Возможно, было бы полезно объяснить, чего вы на самом деле хотите достичь. – Chuck
Кажется, для меня совершенно законный вопрос, который не нуждается в контексте, чтобы иметь смысл. Существует множество причин, по которым у вас будет класс, который не нуждается в какой-либо конкретной настройке. –
@Squeegy: Чак был прав - исходный вопрос должен был объяснить, что я хотел выполнить. Из ответов ниже ясно, что некоторые из респондентов не были уверены в том, что я просил (я фактически поддержал комментарий Чака) – Casebash