1) Почему все (ссылки на)
Objective-C объекты указатели? Почему бы и нет
простые переменные? (т.е. массив NSArray =
[[NSArray alloc] init];)
Подумайте об объекте Objective-C на мгновение как о прославленной структуре.
NSArray array;
в локальной области видимости - это объект, «выделенный» в стеке. NSArray *array;
указывает на объект, поддерживаемый частью памяти, обычно выделяемой из кучи.
Давным-давно было решено, что Objective-C не будет поддерживать объекты в стеке. Главным образом, потому что это сделало бы управление памятью гигантским беспорядком (главным образом, -retain
чего-то в стеке не имеет никакого смысла вообще).
Поскольку Objective-C был спроектирован как чистый надмножество C и, в отличие от C ++, не пытается изменить базовое поведение C, наличие *
в нем казалось естественным.
Обратите внимание, что id
это нарушает, но id
также является полностью универсальным типом. И на самом деле возможно иметь объекты Objective C в стеке. В Snow Leopard блоки на самом деле являются объектами Objective-C и начинаются в стеке. Однако создание собственных объектов в стеке не поддерживается.
2) Почему вы пропускаете звездочку, когда
вызывающий метод?
Поскольку вы не разыменовываете указатель на объект, и этот указатель на объект имеет решающее значение в самой реализации метода. Когда вы говорите ...
[anArray objectAtIndex: 5];
... это точно эквивалентно написанию ...
objc_msgSend(anArray, @selector(objectAtIndex:), 5);
... и когда вы реализуете указанный метод ....
- (id) objectAtIndex: (NSUInteger) anIndex;
... это в точности эквивалентно реализации этой функции C ...
id object_at_index(id self, SEL _cmd, NSUInteger anIndex) { ... }
То есть метод Objective C на самом деле является просто функцией C, которая принимает два или более аргумента. Фактически, вы можете вставить эту строку кода в любую реализацию метода, и она будет «просто работать»:
NSLog(@"method %@", NSStringFromSelector(_cmd));