Что означает «*» в Objective C? - PullRequest
1 голос
/ 06 апреля 2010

Иногда я сталкиваюсь с кодом, который имеет *, иногда **. Кто-нибудь может объяснить, что они имеют в виду Цель C? (Раньше я был программистом на Java, с опытом работы на C / C ++.)

Ответы [ 2 ]

8 голосов
/ 06 апреля 2010

* обозначает, что вы используете указатель на переменную и чаще всего используется для хранения ссылки на объект Objective-C, объекты, которые могут жить только в куче, а не в стеке.

Указатели не являются частью не только Objective-C, но скорее особенностью C (и, следовательно, его производных языков, одним из которых является Objective-C).

Если вы сомневаетесь в разнице между * и **, первая обозначает указатель, а вторая обозначает указатель на указатель; преимущество последнего перед первым заключается в том, что при передаче объекта с использованием ** в параметре метода метод может затем изменить этот параметр, и новое значение будет доступно в вызывающем методе.

Пожалуй, наиболее распространенное использование ** в Какао - это использование NSError объектов. Когда вызывается метод, который может вернуть объект NSError при сбое, сигнатура метода будет выглядеть примерно так:

- (id)someMethodThatUsesObject:(id)object error:(NSError**)error;

Это означает, что вызывающая функция может передавать указатель на объект NSError, но someMethodThatUsesObject: может изменить значение error на другой объект NSError, если это необходимо, что затем может быть доступ к вызывающему методу.

Это часто используется как обходной путь для факта, что функции могут возвращать только одно значение.

3 голосов
/ 06 апреля 2010

A * в Objective-C означает точно так же, как в C; и вы обычно увидите это (или нет) в следующих ситуациях:

// Method signatures:
// Here the asterisk (*) shows that you have a pointer to an NSString instance.
+ (NSString *)stringWithString:(NSString *)aString;

// Method signatures, part two:
// Here the double asterisk (**) signifies that you should pass in a pointer
// to an area of memory (NSError *) where outError can be written.
- (BOOL)writeToURL:(NSURL *) atomically:(BOOL) error:(NSError **)outError;

// Method signatures make for good examples :)
// Here the asterisk is hidden; id is a typedef for void *; and it signifies that
// a pointer to some object of an indeterminate class will be returned
- (id)init;

// And a forth example to round it all out: C strings!
// Here the asterisk signifies, you guessed it, a pointer! This time, it's a
// pointer to the first in a series of const char; terminated by a \0, also known
// as a C string. You probably won't need to work with this a lot.
- (const char *)UTF8String;

// For a bit of clarity, inside example two, the outError is used as follows:
// Here the asterisk is used to dereference outError so you can get at and write
// to the memory it points to. You'd pass it in with:
// NSError *anError;
// [aString writeToURL:myURL atomically:YES error:&anError];
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atom error:(NSError **)outError {
  // do some writing, and if it went awry:
  if (outError != NULL)
    *outError = [NSError errorWithName:@"NSExampleErrorName"];
  return NO;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...