0

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

或者我使用 UIViewController 作为一个没有与之关联的视图控制器的类的父级无关紧要?

4

1 回答 1

1

当您创建一个类时,而不是UIViewController在构建iOS应用程序时经常将其用作默认超类,请将其更改为NSObject.

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

为您的班级命名并NSObjectsubclass 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];
}
于 2013-11-15T00:35:46.317 回答