如何创建一个没有任何特殊父级的类,该类在启动时调用函数?
或者我使用 UIViewController 作为一个没有与之关联的视图控制器的类的父级无关紧要?
当您创建一个类时,而不是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];
}