Является ли `super` локальной переменной? - PullRequest
3 голосов
/ 03 июня 2010
// A : Parent
@implementation A
-(id) init
{
    // change self here then return it
}
@end A

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

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 03 июня 2010

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

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

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

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

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

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

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

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

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

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

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

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

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