创建类实例时运行代码

时间:2013-11-15 00:32:06

标签: objective-c

如何创建一个没有任何特殊父级的类,该类在启动时调用函数?

或者我使用UIViewController作为没有与之关联的View Controller的类的父级并不重要吗?

1 个答案:

答案 0 :(得分:1)

创建一个类时,不要使用UIViewController,而是在构建iOS个应用时将其作为默认超类,请将其更改为NSObject

File -> New -> File... -> Cocoa Touch -> Objective-C Class -> Next -> ...

为您的班级命名,然后从NSObject下拉菜单中选择 subclass of


与许多其他OOP语言不同,Objective-C没有构造函数。相反,从NSObject继承的所有内容都继承了alloc方法(在堆上为对象实例创建内存空间)和默认的init方法。

默认情况下,您使用[[MyObject alloc] init]创建对象的实例,因此如果您覆盖init并将代码放在此处,则会在您运行[[MyObject alloc] init]时执行。您可以创建多个不同的init方法,甚至可以创建factory方法。但基本init覆盖应如下所示:

-(instancetype)init {
    self = [super init];
    if(self) {
        //do stuff
    }
    return self;
}

但我更喜欢进一步改进并编写factory方法,因此我不必每次都输入[[MyObject alloc] init]Factory方法应该与采用相同参数的init方法配对,它们看起来像这样:

+(instancetype)myObject{
    return [MyObject alloc] init];
}

现在而不是:

MyObject *a = [[MyObject alloc] init];

你可以这样做:

MyObject *a = [MyObject myObject];

使用更复杂的init方法更有意义。例如,考虑:

MyDate *today = [[MyDate alloc] initWithYear:2013 month:11 day:14];

我们什么时候可以做:

MyDate *tday = [MyDate dateWithYear:2013 month:11 day:14];

无论initWithYear:month:day:方法看起来如何,factory方法都只是这样:

+(instancetype)dateWithYear:(NSInteger) y month:(NSInteger)m day:(NSInteger)d {
    return [[MyDate alloc] initWithYear:y month:m day:d];
}