Цель-C: Где объявлен этот делегат и другие запросы - PullRequest
1 голос
/ 11 октября 2011

Я хотел бы узнать, где объявлен делегат, указанный исключительно как свойство в определенном демонстрационном видео WWDC Live (Примечание. Для доступа к видео вам потребуется логин Apple Developer).

Соответствующий код приведен ниже, исключая квалификатор свойства iOS 5 по причинам NDA.Я считаю, что этот квалификатор не имеет отношения к моему запросу.

#import <UIKit/UIKit.h>
@class NSManagedObject;
@protocol CoffeeViewControllerDelegate;

@interface CoffeeViewController : UITableViewController
@property (_____,nonatomic) id <CoffeeViewControllerDelegate> delegate;
@end

@protocol CoffeeViewControllerDelegate <NSObject>
 // ...
@end

Мои вопросы:

  1. Где делегат объявлен членом класса?
  2. наследование протокола NSObject по протоколу CoffeeViewControllerDelegate означает, что время выполнения произойдет проверка того, что у делегата есть все NSObject методы?
  3. Почему необходимо переслать объявление NSManagedObject?Является ли это общим требованием при использовании Core Data?

Большое спасибо за ваше время.

Ответы [ 4 ]

3 голосов
/ 11 октября 2011
  1. Я думаю, что это функция LLVM (новый компилятор Objective-C Apple, заменяющая GCC), которая означает, что переменная создается, когда вы @synthesize свойство (я не уверен на 100% в этом)
  2. Нет. Это будет проверено во время компиляции
  3. Вы также можете #import <CoreData/CoreData.h>, но ваш код будет компилироваться быстрее, просто сделав предварительное объявление. По сути, ему не нужно ничего знать о реализации, кроме его размера (это объект, то есть указатель)
1 голос
/ 11 октября 2011

Где делегат объявлен как член класса?

Это прямо здесь:

@property (_____,nonatomic) id <CoffeeViewControllerDelegate> delegate;

Синтезирован ивар, используемый для реализации свойства (не показано)в приведенном вами коде), но это стандартная практика в наши дни.

Означает ли наследование протокола NSObject протоколом CoffeeViewControllerDelegate, что произойдет проверка во время выполнения, что у делегата есть все методы NSObject?*

Нет, я не думаю, что это должно произойти во время выполнения.Компилятор может это проверить.

Почему необходимо пересылать объявление NSManagedObject?Является ли это общим требованием при использовании Core Data?

Обычно используется предварительное объявление всякий раз, когда вы хотите сослаться на класс, но не должны использовать его интерфейс.Альтернативой является включение всего заголовочного файла, в котором он определен, или зонтичного заголовка для всей платформы.Это только замедлит процесс - все, что заботит компилятор на этом этапе, это то, что NSManagedObject относится к некоторому классу.

1 голос
/ 11 октября 2011

1) Когда вы указали свойство без члена класса, цель c автоматически создаст для вас приватного члена.

2) Это просто говорит вам, что делегат уважает этот протокол. Вы должны сделать эту проверку вручную, используя [делегат conformsToProtocol: @protocol (CoffeeViewControllerDelegate)] перед назначением. Проверка протокола обычно выполняется компилятором во время компиляции

3) Потому что у вас может быть проблема циклического импорта. Если вам просто нужно использовать вашу сущность в качестве типа, используйте предварительное объявление, если вы используете какой-то метод экземпляра этого класса, вы должны использовать импорт.

0 голосов
/ 11 октября 2011

Теперь вам не нужно явно объявлять _delegate ivar; ваша реализация просто нуждается в @synthesize delegate.

Вы все равно должны проверить во время выполнения, что делегат соответствует ожидаемому протоколу.

Исходя из предоставленного фрагмента кода, я не вижу необходимости в предварительном объявлении NSManagedObject.

...