Является ли `супер` локальной переменной?

67
5

// A : Parent
@implementation A
-(id) init
{
// change self here then return it
}
@end A

A *a = [[A alloc] init];


а. Просто интересно, если само локальная переменная или глобальная? Если он локальный, то какая точка self = [super init] в init? Я могу успешно определить некоторую локальную переменную и использовать ее так: зачем мне назначать ее self.


-(id) init
{
id tmp = [super init];
if(tmp != nil) {
//do stuff
}
return tmp;
}

б. Если [super init] возвращает некоторый другой экземпляр объекта, и я должен перезаписать self, то я больше не смогу получить доступ к методам A, так как это будет совершенно новый объект? Я прав?


с. super и self, указывающие на одну и ту же память, и основное различие между ними - порядок поиска метода. Я прав?


Извините, у меня нет Mac, чтобы попробовать, изучая теорию на данный момент...

спросил(а) 2010-06-03T04:08:00+04:00 9 лет, 7 месяцев назад
2
Решение
82

Ответ Dreamlax правильный... но, пояснение может быть полезно.


а. Просто интересно, если я - локальный переменная или глобальная? Если это локально, тогда какова точка самости = [супер init] в init? Я могу успешно определить некоторую локальную переменную и использовать например, почему мне нужно назначать это для себя.



self не является локальной переменной. Это аргумент вызова метода. Первый аргумент, по сути. Второй аргумент - _cmd, имя селектора выполняемого метода.


Что особенно важно в self, так это то, что self используется компилятором для доступа к переменным экземпляра. То есть, если вы скажете self = [super init], и суперкласс init будет возвращать что-то другое, любые последующие обращения к экземплярам все равно будут правильными.


б. Если [super init] возвращает некоторые другие объект, и я должен перезаписать себя, тогда я не смогу для доступа к методам A больше, поскольку это будет совершенно новый объект? Я не так ли?


Если super init возвращает экземпляр чего-то, что несовместимо с A, тогда в дизайне суперкласса что-то ужасно пошло наперекосяк. Имейте в виду, что Objective-C полностью динамичен. Таким образом, нет никакой причины, что все, что возвращается super init, действительно должно быть экземпляром A, но лучше было чертовски хорошо действовать как A. Теперь это может быть совершенно новый экземпляр подкласса A, и, таким образом, все методы A будут работать отлично.


Чтение между строками; помните, что Objective-C полностью динамичен. Нет такой вещи, как отправка статического метода. Класс объекта может измениться в любой момент, и любой вызов случайного метода будет работать до тех пор, пока новый класс отвечает на этот метод. Не то, чтобы это на самом деле происходит во время выполнения, просто может.


с. супер и я, указывая на то же самое памяти и основных различий между ними - порядок поиска метода. Я прав?



Теперь это забавный вопрос. super на самом деле ничего не указывает. Для всех целей и целей super можно рассматривать как один бит магии в этом. То есть, когда компилятор видит super как цель вызова метода, он компилирует его как несколько другой сайт вызова, который вызывает один из вариантов objc_msgSendSuper(), который - как следует из названия - эффективно "ищет" для реализации метода, начиная с родительского класса класса, в котором был скомпилирован вызов.

ответил(а) 2010-06-03T09:56:00+04:00 9 лет, 7 месяцев назад
Еще 1 ответ
58

    Я - аргумент, предоставляемый реализации метода. Все методы класса Objective-C экземпляра и класса имеют два неявных аргумента, предшествующих аргументам метода. Неявные аргументы self и _cmd. _cmd - это селектор, используемый для определения реализации метода.


    Если super возвращает экземпляр другого класса, то это будет так, но также возможно, что он может вернуть другой экземпляр того же класса.


    super - это ключевое слово, а не переменная. Он сообщает компилятору использовать другую функцию времени выполнения, которая начинает разрешение метода на одном классе выше текущего класса.


ответил(а) 2010-06-03T04:12:00+04:00 9 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема