Дизайн для интерфейса не для реализации в Objective-C - PullRequest
1 голос
/ 14 апреля 2011

Я читал книгу о шаблонах проектирования для Objective-C и много раз читал такие вещи, как

id <AProtocol> obj;

Но я думаю, что на практике это не совсем удобно по простой причине: в iOS вы должны управлять выпуском памяти, вызывающим объект. Если вы просто отклоните его с помощью «id <Protocol>» и вам нужно освободить этот объект, XCode предупредит вас, что метод «release» отсутствует в этом протоколе.

Таким образом, более реалистичный подход был бы

NSObject <AProtocol> *obj;

Я прав?

Ответы [ 4 ]

3 голосов
/ 14 апреля 2011

Существует также протокол NSObject, поэтому вы можете просто определить:

@protocol AProtocol <NSObject>

Таким образом, будут видны методы retain, release и т. Д. NSObject.Смотри также этот вопрос .

2 голосов
/ 14 апреля 2011

Используйте самое конкретное, что вы можете. Используйте NSObject *, если вы знаете , что это экземпляр NSObject, а не, скажем, NSProxy.

Используйте NSView <AProtocol>*, если вы знаете, что экземпляр является подклассом NSView.

Однако это не имеет ничего общего с -релизом. Если вам требуется протокол для определения метода выпуска, то есть для объекта не имеет смысла реализовывать этот интерфейс, если он также не реализует протокол NSObject, включите протокол NSObject в определение AProtocol, как демонстрирует @Bavarious. .

2 голосов
/ 14 апреля 2011

Вы также можете заставить AProtocol самому соответствовать протоколу NSObject:

@protocol AProtocol <NSObject>
…
@end

При этом компилятор не выдаст предупреждение для:

id <AProtocol> obj;
…
[obj release];
2 голосов
/ 14 апреля 2011

К сожалению NSObject <AProtocol> *obj не скомпилируется.Но вы можете сообщить компилятору, что ваш объект соответствует протоколу NSObject.Просто объявите:

id <NSObject,AProtocol> object;

Если вы считаете, что это слишком многословно, вы можете "импортировать" протокол NSObject в свой, когда определите его:

@protocol AProtocol <NSObject>
// ...
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...