Используется ли когда-либо self для возврата ссылки на класс в Objective-C? - PullRequest
1 голос
/ 20 октября 2010

Я работаю над книгой по какао и Objective-C. Один пример поставил меня в тупик:

- (id) currentObject {
   return [Photo photo];
}

- (void) checkObjectType {
    id object = [self currentObject];
    ...
}

В этом случае checkObjectType вызывает currentObject. Затем currentObject возвращает экземпляр Photo, однако он создает новый экземпляр Photo и возвращает эту ссылку, не так ли? Разве это не возвращает ссылку на себя? Я ожидал что-то вроде:

return self;

Спасибо

Scott

Ответы [ 3 ]

2 голосов
/ 20 октября 2010

Вы, должно быть, имеете в виду книгу Скотта Стивенсона.Данный пример просто пытается показать, как использовать метод isMemberOfClass:.Я бы не стал больше в это разбираться.

Ваша путаница понятна.Как вы уже выяснили, метод currentObject: возвращает вновь созданный автоматически выпущенный объект, не сам объект, как следует из его имени.Это плохо названный метод.Может быть, это просто хитрый способ напомнить читателю, чтобы он называл методы соответствующим образом.:)

1 голос
/ 20 октября 2010

Я, вероятно, собираюсь поднять это, но здесь идет ...

Ваш фрагмент кода находится в классе.Этот класс имеет метод с именем currentObject, который возвращает Photo объект.

id object = [self currentObject];

Это запрашивает текущий класс self для вызова метода currentObject, который как раз и является Photo объектом.Возьмите этот фотообъект и присвойте ему object

Если в разделе книги обсуждается тип id, то это, кажется, статический пример для метода, который разработан, чтобы показать, как (id)метод, подобный currentObject, мог бы вернуть любой тип объекта.

Возможно, лучшим примером был бы:

- (id) currentObject:(NSString *)someKey {
   return [someDictionary objectForKey:someKey];
}

- (void) checkObjectType {
    id object = [self currentObject:@"photo"];
    ...
}

, где someDictionary содержал множество объектов, таких как NSString, Photo и NSURL.currentObject может справиться со всеми ними.

0 голосов
/ 20 октября 2010

Да, currentObject возвращает результат [Photo photo].Предполагая, что соблюдаются нормальные соглашения о присвоении имен Какао, Photo является классом (потому что он начинается с заглавной буквы), поэтому +photo является методом класса, который (предположительно) возвращает экземпляр класса Photo.Поскольку имя метода не содержит alloc или copy, мы можем далее сделать вывод, что он возвращает автоматически выпущенный объект.

Имя метода «currentObject» в данном случае, безусловно, сбивает с толку, но делает это:1010 *

- (id) currentObject {
   return self;
}

было бы совершенно бессмысленно: [self currentObject] было бы так же, как сказать self

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...