Какова внутренняя структура личности? - PullRequest
0 голосов
/ 14 сентября 2018

Почему self можно использовать в методах реализации или в методах класса?Какова внутренняя структура личности?Например:

#import "Person.h"

@implementation Person
+ (void)initialize
{
    [super initialize];
    [self setupModel];
}
- (instancetype)init
{
    self = [super init];
    if (self) {
        [self test];
    }
    return self;
}
+ (void)setupModel
{
    NSLog(@"setup a person object");
}
- (void)test
{
    NSLog(@"this method is called");
}
@end

Результаты выполнения кода: 2018-09-17 09: 32: 40.615578 + 0800 Test [662: 301213] настройка объекта person 2018-09-17 09: 32: 40.615662 + 0800 Test[662: 301213] этот метод называется

Результаты выполнения кода

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Это детали реализации, поэтому вам не следует полагаться на них:

self является либо теговым указателем , либо подлинным указателем на структуру, которая начинается с isa поле, а затем содержит все переменные экземпляра объекта.

Поле isa само по себе является либо набором битовых полей , который содержит содержимое экземпляра, некоторые флаги и указатель наClass экземпляра или (на старых и 32-разрядных платформах) это просто указатель на Class экземпляра (в этом случае счет сохранения сохраняется в глобальной хеш-таблице).

0 голосов
/ 14 сентября 2018

Для методов экземпляра, self является ссылкой на текущий объект.
Для методов класса, self является ссылкой на текущий класс.

Если вы объявляете метод Objective-Cвот так

- (void)doSomethingWithObject:(id)object { ... }

компилятор в основном просто превращает его в функцию C со следующей сигнатурой:

void _i_classname_doSomethingWithObject_(const id self, const SEL _cmd, id object) { ... }

(где classname - это имя класса, к которому относится метод.Методы класса i становятся c)


Когда вы вызываете метод [foo doSomethingWithObject:bar], компилятор превращает этот вызов метода в вызов objc_msgSend, который «перенаправляет» вызов в правильную реализацию:

objc_msgSend(foo, @selector(doSomethingWithObject:), bar);

Как вы можете видеть, параметры, переданные в objc_megSend, такие же ожидаемые функцией C, содержащей реализацию метода Objective-C.

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