Использование Asterisk в Objective-C - PullRequest
3 голосов
/ 10 января 2010

У меня был вопрос относительно использования звездочек в Objective-C. Просто чтобы прояснить: я понимаю, что такое указатели и все в процедурном C. Хотя мне было интересно две вещи:

1) Почему все (ссылки на) объекты Objective-C указатели? Почему не простые переменные? (т. е. массив NSArray = [[NSArray alloc] init];)

2) Почему вы опускаете звездочку при вызове метода?

Спасибо!

Ответы [ 2 ]

20 голосов
/ 10 января 2010

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));
2 голосов
/ 10 января 2010

Язык Objective C откладывает столько решений, сколько может от времени компиляции и связывания до времени выполнения. Когда это возможно, он динамически выполняет такие операции, как создание объектов и определение того, какой метод вызывать.
Так что, если это разрешено

NSArray array = [[NSArray alloc] init];  

в методе, то компилятор должен знать размер NSArray во время компиляции.

...