Как раз когда я думаю, что освоился с Objective-c, упомянутые символы полностью бросают меня в кроличью нору ...

** двойной указатель ??

& Что я могу делать с помощью & reference, это @property? полный на объекте? странный указатель разлетелось?

± Я вижу как +, так и - перед объявлением метода; Я видел, как Java аннотирует некоторые объявления типов данных, вручную набирая +, и волшебство компиляции в Eclipse изменило бы их на -

Скорее всего, я задаю повторяющиеся вопросы и / или выхожу за рамки своих предположений; спасибо за ответы / правки.

8
edwardsharp 30 Авг 2011 в 09:54

3 ответа

Лучший ответ

Как вы, возможно, знаете, указатель указывает на адрес объекта и является способом ссылки на объект. Двойной указатель иногда используется в Objective-C, в основном для возврата NSErrors, где вы хотите вернуть адрес, то есть указатель, на объект ошибки (NSError), если произошла ошибка, таким образом вы передаете указатель, присвоенный null и вызывающий может изменить этот указатель так, чтобы он указывал на адрес другого указателя, который, в свою очередь, указывает на объект NSError.

Амперсанд (&) в основном используется API нижнего уровня C, например Основная графика. Они используются для ссылки на вещи, такие как текущий контекст. Пока большая часть вашего кода использует квадратные скобки вокруг вызовов методов, вы не будете часто их видеть.

Использование + или - перед объявлением метода используется для различения методов класса (+) и экземпляра (-). Методы класса вызываются для самого класса (например, alloc), а метод экземпляра вызывается для экземпляра этого объекта (например, init).

6
David Rönnqvist 30 Авг 2011 в 06:07

Вы попадаете в часть C, на которой построен objective-c.

** - указатель на указатель. Поскольку функции в C принимают аргументы по значению, это означает, что вы не можете изменить значение аргумента в этой функции. Но, предоставив уровень косвенности и передав указатель на указатель, вы можете изменить значение.

& означает ссылку. Если аргумент принимает **, а у вас есть переменная *, передайте на нее ссылку.

Foo *foo;
[self changeFoo: &foo];

- (BOOL)changeFoo: (Foo **)foo
{
     // dereference the double pointer and assign a val = alloc init returns a *
     *foo = [[Foo alloc] init];
     return YES;
}

Обычное использование в objective-c / cocoa - это NSError. По сути, это наш аргумент.

NSError *err;
BOOL success = [self doSomething:@"Foo" error:&err];

- (BOOL)doSomething:(NSString*)withData error:(NSError**)error
{
}
12
bryanmac 30 Авг 2011 в 06:07

- и + перед объявлением метода обозначают метод экземпляра и метод статического класса. Чтобы использовать метод экземпляра, вы должны создать объект своего класса, прежде чем вы сможете вызвать его метод, статический метод может быть вызван непосредственно из типа класса.

2
Dmitry Samuylov 30 Авг 2011 в 06:03