是否可以创建一个没有init方法的类,以强制所有调用者使用工厂方法创建对象?
答案 0 :(得分:5)
基本上,你想确保你的类永远不会使用-init初始化,对吧?你不能完全你想做什么,但你可以近距离接触。
由于你从NSObject继承,你有一个init方法,你无法阻止它被调用。也就是说,你可以覆盖init到这个:
- (id)init
{
[self dealloc];
@throw [NSException exceptionWithName:@"MyExceptionName" reason:@"Reason" userInfo:nil];
return nil;
}
这样,只要有人调用你的-init方法,它就会杀死对象,所以实际上你的init方法几乎是不可调用的。
答案 1 :(得分:4)
如果您真的想为使用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
的{{1}},因为您可能希望为您的类无法识别的选择器实现自己的行为。
答案 2 :(得分:1)
取决于。如果您的类继承自NSObject
,则它将具有继承的init
方法(对您的实例变量不执行任何操作)。所以从这个意义上讲,即使你真的不想拥有init
方法,你很可能还有一个方法。因此,如果您的问题是“我是否需要实施一个简单的init
方法?”,答案是“不,您不需要”。但是,如果您的问题是“我是否需要调用init
方法,如果我没有覆盖它?”,那么答案是“是的,你做的”。无论你使用NSObject子类做什么,在某些时候你仍然需要在创建对象后调用init
。这就是生活方式。
话虽这么说,你很可能想要一个init
方法,除非你的对象初始化只需要将整个对象归零。
否则,如果您选择不继承自NSObject
或其任何子类,并且只是从没有继承,这显然是一个坏主意,因为NSObject
class处理ObjC运行时需要做的所有事情,并且要求非常高,那么你最终可能没有init
方法。。但严重的是,不要在家里试试。
答案 3 :(得分:0)
不确定。在Objective-C中,没有实际的构造函数。 init
- 类型方法通常用于初始化类,与构造函数一样,但它们只是一个“普通”方法(没有什么特别的,就像它们有,例如,Java构造函数)
也就是说,除非您的类为其实例执行 no 初始化,否则您可能希望使用某种init
方法。
答案 4 :(得分:0)
NSObject
为您执行init
方法,无论它做什么。如果您的类在实例化时没有任何设置,则只需不要覆盖-(id)init
提供的NSObject
方法。但是在创建实例时仍然会调用它。