2011-04-30 61 views
30

我是iPhone開發人員的初學者。我正在嘗試下面的示例程序。目標C中的構造函數C

我沒有在B類中調用+(void)初始化和 - (id)init方法,而是自動調用它。

是的 - (空)intialise等於默認的構造函數在客觀C.

請問[超級初始化]指向NSObject的。

如果我不使用 - (id)初始化方法,我得到一個警告,說這個類是不完整的實現。

ClassA.h

#import <Foundation/Foundation.h> 

static int ab; 

@interface ClassA : NSObject { 
    int a; 
} 

+ (void) initialize; 
- (id) init; 
- (void) displayNumOfInstance; 
- (void) disp; 

@end 

ClassA.m

#import "ClassA.h" 

@implementation ClassA 

+ (void) initialize 
{ 
    ab=0; 
} 

- (id) init 
{ 
    self = [super init]; 
    if (self!=nil) { 
     ab++; 
    } 
    return self; 
} 

- (void) displayNumOfInstance 
{ 
    NSLog(@"Number of instances of this class:%d",ab); 
} 

- (void) disp 
{ 
    NSLog(@"The value is %d",ab); 
} 

@end 

ClassB.h

#import <Foundation/Foundation.h> 
#import "ClassA.h" 

@interface ClassB : ClassA { 

} 

- (void) display; 

@end 

ClassB.m

#import "ClassB.h" 

@implementation ClassB 

- (void) display 
{ 
    ab=20; 
    NSLog(@"The value ab is %d",ab); 
} 

@end 

class2.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; 
} 

輸出:

2011-04-30 15:31:42.490 class2[1674:a0f] 1 
2011-04-30 15:31:42.493 class2[1674:a0f] The value ab is 20 
2011-04-30 15:31:42.494 class2[1674:a0f] 2 
2011-04-30 15:31:42.495 class2[1674:a0f] The value ab is 20 

回答

57

默認結構通常與具有以下格式-init或在本任何變體,例如啓動-initWithFrame:

方法+initialize是一個類方法(靜態方法),這就是所謂的至少一次應用程序啓動時。您可以使用此方法來初始化在類的所有實例中都有用的靜態變量。這種方法可能對例如爲一個類初始化共享緩存或共享查找映射。

對於NSObject-init方法是指定初始化,但對於其他類,這可能是不同的。 Apple使用NS_DESIGNATED_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"]; 
} 

更多細節:我們可以按如下方式實現它