Ошибка объявления экземпляра класса цели c? - PullRequest
2 голосов
/ 12 мая 2011

Я очень новичок в target-c, и я пытаюсь объявить новый экземпляр UITableView в XCode. Вот мой код:

UITableView *mainTable = [[UITableView alloc] init];

и XCode указывает на = и беспокоит меня о точке с запятой в конце оператора объявления, который, очевидно, есть.

EDIT:

#import <UIKit/UIKit.h>

@interface TestRunAppDelegate : NSObject <UIApplicationDelegate> {

    UITableView *mainTable = [[UITableView alloc] init];

}

Ответы [ 3 ]

4 голосов
/ 12 мая 2011

Вы не можете делать назначения внутри интерфейса класса .

Переместите назначение в метод init делегата приложения:

#import <UIKit/UIKit.h>

@interface TestRunAppDelegate : NSObject <UIApplicationDelegate> {

    UITableView *mainTable;

}
@end

@implementation TestRunAppDelegate

- (id)init {

    if( !(self = [super init]) ){
        return nil;

    mainTable = [[UITableView alloc] init];

    return self;
}
@end

Блок @interface (все от @interface до @end) просто говорит другому коду, что ожидать от вашего класса. Он ничего не делает сам по себе. Между фигурными скобками вы объявляете переменные экземпляра, но на самом деле не создаете никаких объектов. После объявления переменной экземпляра и до @end вы объявляете свои методы. Опять же, вы их не реализуете. Вы просто позволяете компилятору и любому другому коду, импортирующему ваш заголовок, знать, что они могут ожидать от вашего класса.

Причина разделения реализации и интерфейса таким образом * заключается в реализации одного из принципов объектно-ориентированного программирования. Объект по существу сообщает другим объектам, что он может сделать (интерфейс), но не делает никаких заявлений относительно того, как он выполнит задачу (реализацию).


* Они обычно помещаются в два отдельных файла, но на самом деле не имеют .

4 голосов
/ 12 мая 2011

Вы можете присвоить значение только переменной внутри метода в вашем @implementation.Декларация в @interface, по сути, является «напором» для системы.

Приложение: Материал в @interface на самом деле не делает ничего;это просто директива для компилятора, чтобы знать, что искать, некоторые хуки для Interface Builder и публичное заявление о том, что делает ваш класс.Часть, которая имеет значение, это @implementation, но даже тогда, вне директив компилятора, таких как @synthesize, учитываются только вещи внутри методов.Objective-C не является процедурным;он не будет выполнять каждую строку по порядку.Директивы компилятора, такие как @synthesize, анализируются и обрабатываются компилятором, который в случае @synthesize создает новые методы, и директивы препроцессора, такие как #define, которые снова обрабатываются до того, как система времени выполнения их когда-либо видит.Система времени выполнения может выполнять только блоки кода - ваши методы;в нем нет смысла всего вашего @implementation, только методы класса.Все, что находится за пределами класса, неизвестно системе времени выполнения, поэтому это не будет действительный код.Вот почему вы должны выполнять присваивание внутри метода в вашей реализации.

4 голосов
/ 12 мая 2011

Вы пытаетесь создать экземпляр переменной экземпляра в @interface.Вы должны сделать это в блоке @implementation.

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