Подтвердить что ты не робот

Конструктор в Objective C

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

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

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

Указывает ли [super init] на 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
4b9b3361

Ответ 1

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