Конструктор в Цели C - PullRequest
       1

Конструктор в Цели C

30 голосов
/ 30 апреля 2011

Я новичок в разработке для iPhone. Я пробовал эту программу ниже.

Я не вызываю метод инициализации + (void) и - (id) init в классе B. Но его получениевызывается автоматически.

Является ли инициализация - (void) равной конструктору по умолчанию в задаче C.

Указывает ли [super init] на объект NSObject.

Еслия не использую - (id) метод init, я получаю предупреждение о том, что класс с неполной реализацией.

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

1 Ответ

58 голосов
/ 30 апреля 2011

Конструкция по умолчанию обычно начинается со следующего формата -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"];
}

Более подробную информацию об инициализации можно найти на веб-сайте Apple Developer:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...