Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C中的构造函数_Objective C - Fatal编程技术网

Objective-C中的构造函数

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

我正在尝试下面的示例程序

我不是在类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 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"];
}