创建没有init方法的类(Objective-c)

时间:2010-02-02 23:12:05

标签: objective-c

是否可以创建一个没有init方法的类,以强制所有调用者使用工厂方法创建对象?

5 个答案:

答案 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方法。但是在创建实例时仍然会调用它。