Почему переменные экземпляра определяются в заголовочном файле в Objective C

попробуйте получить событие, используя переданный параметр (в данном случае названный e). Я проверил это, и оба window.event и e поддерживаются в Chrome.

попробуйте проверить оба типа, в зависимости от того, что существует

var ex = {
  exampl: function(e){

    console.log(window.event);
    console.log(e);  

    //check if we have "e" or "window.event" and use them as "evt"
    var evt = e || window.event    

  }
}

6
задан farhadf 8 June 2009 в 20:39
поделиться

5 ответов

Причина в том, что он может вычислять смещения переменных для подклассов.

@interface Bird : NSObject {
    int wingspan;
}
@end
@interface Penguin : Bird {
    NSPoint nestLocation;
    Penguin *mate;
}
@end

Не зная структуры класса "Bird", класс "Penguin" не может вычислить смещение его поля с начала структуры. Структура пингвина выглядит примерно так:

struct Penguin {
    int refcount; // from NSObject
    int wingspan; // from Bird
    NSPoint nestLocation; // from Penguin
    Penguin *mate; // from Penguin
}

У этого есть побочный эффект: если вы измените размер класса в библиотеке, вы сломаете все подклассы в приложениях, которые связаны с этой библиотекой. Новые свойства позволяют обойти эту проблему.

8
ответ дан 8 December 2019 в 03:10
поделиться

Хотя они объявлены в файле заголовка, все переменные экземпляра в Objective-C имеют доступ @protected по умолчанию. Это означает, что переменная доступна в классе, который объявляет ее, и в любом классе, наследующем от этого класса.

Вот документация Apple по определению класса Objective-C: Определение классов

Обратите внимание на раздел под названием «Область действия» переменных экземпляра ".

6
ответ дан 8 December 2019 в 03:10
поделиться

Я думаю, что это техническая проблема. Если я правильно понимаю, класс Objective-C - это просто причудливая структура C. А для использования структуры необходимо знать ее размер. (Например, как бы в противном случае работал sizeof ())

6
ответ дан 8 December 2019 в 03:10
поделиться

Взято из раздела документации Apple по определению классов Objective-C, Роль интерфейса :

Хотя переменные экземпляра наиболее естественно рассматриваются как реализация класса, а не его интерфейса, они, тем не менее, должны быть объявлены в файле интерфейса. Это потому, что компилятор должен знать структуру объекта, в котором он используется, а не только то, где он определен.

3
ответ дан 8 December 2019 в 03:10
поделиться

Обратите внимание, что в Objective C 2.0 новая «Современная среда выполнения» (доступна в приложениях iPhone и 64-битных приложениях Mac OS X 10.5) вам не нужно указывать ivars, вы можете указать properties, а затем используйте @synthesize для генерации ivar.

Это связано с тем, что в современной среде исполнения ivars имеют глобальный символ косвенного обращения, который содержит смещение для ivar. Это также решает проблему хрупкого базового класса, позволяя переупорядочивать и добавлять ivars без необходимости перекомпиляции подклассов (удаление или переименование ivars может по-прежнему вызывать ошибки связи).

Однако вам все равно нужно перечислить свойства в главном интерфейсе, поэтому там не похоже, чтобы полностью скрыть частные ivars, что прискорбно. Вы не можете, например, использовать свойство и @synthesize в категории.

2
ответ дан 8 December 2019 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: