Инициализация объектов с использованием Objective-C, требуется уточнение - PullRequest
0 голосов
/ 23 августа 2011

если заголовок файл объявляет

@interface SomeClass: NSObject {
  Data* d;
}

@property (nonatomic, retain) Data* d;

Почему следующая строка в файле реализация выдает предупреждение (а метод init не получаетвызывается?)

[[[self d] alloc] init];

Получаемое предупреждение:

Метод экземпляра '-alloc' не найден (тип возвращаемого значения по умолчанию равен 'id')

Между тем, Data имеет метод - (id) init, который не вызывается.

Пожалуйста, помогите мне понять, почему.

Ответы [ 3 ]

5 голосов
/ 23 августа 2011

alloc должен вызываться для класса , а не для экземпляра .

interface SomeClass : NSObject
{
    Data *d;
}

Объявите метод init в SomeClass и сделайте его похожим на:

- (id) init
{
    self = [super init]; 
    if (self)
    {
        d = [[Data alloc] init];
    }

    return self;
}

- (void) dealloc
{
    [d release];
    [super dealloc];
}  

Теперь вы делаете:

SomeClass *c = [[SomeClass init] alloc];

И вы можете использовать класс. Обратите внимание, что вам, вероятно, следует прочитать немного больше о классах и объектах, а также об управлении памятью (когда вы должны выпустить c и т. Д.).

Если, по какой-либо причине, у вас есть возможность использовать ARC (автоматический подсчет ссылок), вам не нужно заботиться о выпуске материала. Но это не идет с Xcode 4.1, только с 4.2, который не является общедоступным, по-видимому.

2 голосов
/ 23 августа 2011

Проблема не в -(id)init, а в -(id)alloc. alloc - это class метод NSObject, что означает, что вы отправляете его самому классу, а не экземпляру этого класса, т.е.

[Data alloc]; // Correct
[someDataInstance alloc]; // Method not found

Когда вы звоните [self d], вы получаете экземпляр Data, которому вы затем отправляете сообщение - (id) alloc. Поскольку NSObject не имеет -(id)alloc (только +(id)alloc), вы получите предупреждение.

1 голос
/ 23 августа 2011

Вы должны делать

self.d = [[Data alloc] init];

Как говорит Мэтт, alloc является методом класса и должен вызываться для самого класса.

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