Почему id является слабым ссылочным указателем?
id
не является слабым ссылочным указателем, по крайней мере, не в смысле владения ARC. Слабая ссылка типа id
на объект или нет, зависит от того, была ли объявлена ссылка __weak
(и варианты), и от класса объекта, фактически поддерживающего слабые ссылки.
Однако, вы могли бы сказать, что id
обеспечивает слабую типизацию , хотя я думаю, что динамическая / утиная типизация - более точное описание. Поскольку id
типизированная ссылка не содержит информации о типе класса времени компиляции, компилятор не может, например, определить, может ли базовый объект ответить на данный селектор, что может привести к ошибкам во время выполнения.
Как он может обрабатывать любой указатель типа класса?
Это часть определения языка Objective-C . Компилятор распознает id
как супертип каждого класса Objective-C и обрабатывает id
по-разному. Смотрите также ответ ниже.
Во время выполнения, как мы можем определить, какой тип указателя класса назначен на id?
Во время выполнения Apple Objective-C первые байты в памяти, выделенной для объекта, должны указывать на класс этого объекта. Вы можете увидеть это в другом месте как указатель isa
, и именно так среда выполнения Apple определяет класс каждого объекта 1 . Тип id
также определен, чтобы иметь эту информацию. Фактически, его единственный атрибут - указатель isa
, что означает, что все объекты 1 Objective-C соответствуют этому определению.
Если у вас есть ссылка id
и вы хотите узнать класс ссылочного объекта, вы можете отправить его -class
:
id someObject;
// Assign something to someObject
// Log the corresponding class
Class c = [someObject class];
NSLog(@"class = %@", c);
// Test whether the object is of type NSString (or a subclass of NSString)
if ([someObject isKindOfClass:[NSString class]]) {
NSLog(@"it's a string");
}
1 Помеченные указатели являются заметным отклонением этой структуры, и (частично) из-за них нельзя напрямую обращаться к указателю isa
.