Objective-C中的构造函数
我正在尝试下面的示例程序 我不是在类B中调用+(void)initialise和-(id)init方法,而是自动调用它 是否-(void)初始值等于目标C中的默认构造函数 [super init]是否指向NSObject 如果我没有使用-(id)init方法,我会收到一条警告,说明该类的实现不完整 A.h级Objective-C中的构造函数,objective-c,Objective C,我正在尝试下面的示例程序 我不是在类B中调用+(void)initialise和-(id)init方法,而是自动调用它 是否-(void)初始值等于目标C中的默认构造函数 [super init]是否指向NSObject 如果我没有使用-(id)init方法,我会收到一条警告,说明该类的实现不完整 A.h级 #import <Foundation/Foundation.h> static int ab; @interface ClassA : NSObject { int
#import <Foundation/Foundation.h>
static int ab;
@interface ClassA : NSObject {
int a;
}
+ (void) initialize;
- (id) init;
- (void) displayNumOfInstance;
- (void) disp;
@end
B.h类
#import <Foundation/Foundation.h>
#import "ClassA.h"
@interface ClassB : ClassA {
}
- (void) display;
@end
类别2.m
#import <Foundation/Foundation.h>
#import "ClassA.h"
int main (int argc, const char * argv[]) {
ClassA *a = [[ClassA alloc]init];
[a disp];
[a release];
ClassB *b = [[ClassB alloc]init];
[b display];
[b release];
ClassA *a1 = [[ClassA alloc]init];
[a1 disp];
[a1 release];
ClassB *b1 = [[ClassB alloc]init];
[b1 display];
[b1 release];
return 0;
}
默认构造通常以以下格式开始,即
-init
或其任何变体,例如-initWithFrame:
方法+initialize
是一种类方法(静态方法),在应用程序启动时至少调用一次。您可以使用此方法初始化对类的所有实例都有用的静态变量。此方法可能有助于初始化类的共享缓存或共享查找映射
对于NSObject
,-init
方法是指定的初始值设定项,但对于其他类,这可能有所不同。Apple使用NS\u designed\u initializer
宏在其类标题中记录指定的初始值设定项。例如,UIView
子类应该替代-initWithFrame:
和-initWithCoder:
,因为这些方法被标记为指定的初始值设定项
当子类化和实现自定义指定的初始值设定项时,不要忘记初始化超类。例如,让我们有一个UIView
子类,它有一个自定义指定的初始值设定项-initWithFrame:title:
。我们将按以下方式实施:
// A custom designated initializer for an UIView subclass.
- (id)initWithFrame:(CGRect)frame title:(NSString *)title
{
// Initialize the superclass first.
//
// Make sure initialization was successful by making sure
// an instance was returned. If initialization fails, e.g.
// because we run out of memory, the returned value would
// be nil.
self = [super initWithFrame:frame];
if (self)
{
// Superclass successfully initialized.
self.titleLabel.text = title
}
return self;
}
// Override the designated initializer from the superclass to
// make sure the new designated initializer from this class is
// used instead.
- (id)initWithFrame:(CGRect)frame
{
return [[self alloc] initWithFrame:frame title:@"Untitled"];
}
有关初始化的更多详细信息,请访问Apple开发者网站:
#import <Foundation/Foundation.h>
#import "ClassA.h"
int main (int argc, const char * argv[]) {
ClassA *a = [[ClassA alloc]init];
[a disp];
[a release];
ClassB *b = [[ClassB alloc]init];
[b display];
[b release];
ClassA *a1 = [[ClassA alloc]init];
[a1 disp];
[a1 release];
ClassB *b1 = [[ClassB alloc]init];
[b1 display];
[b1 release];
return 0;
}
// A custom designated initializer for an UIView subclass.
- (id)initWithFrame:(CGRect)frame title:(NSString *)title
{
// Initialize the superclass first.
//
// Make sure initialization was successful by making sure
// an instance was returned. If initialization fails, e.g.
// because we run out of memory, the returned value would
// be nil.
self = [super initWithFrame:frame];
if (self)
{
// Superclass successfully initialized.
self.titleLabel.text = title
}
return self;
}
// Override the designated initializer from the superclass to
// make sure the new designated initializer from this class is
// used instead.
- (id)initWithFrame:(CGRect)frame
{
return [[self alloc] initWithFrame:frame title:@"Untitled"];
}