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()
, который - как следует из названия - эффективно "ищет "для реализации метода, начиная с родительского класса класса, в котором был скомпилирован вызов .