Делает ли простое соответствие протоколу Objective-C что-нибудь?

#objective-c #uikit #protocols

#objective-c #uikit #протоколы

Вопрос:

CocoaPlant определяет протокол CPCoreDataTraits , аналогичный UITexInputTraits , например:

 #import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@protocol CPCoreDataTraits <NSFetchedResultsControllerDelegate>

@optional

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;

@end
  

Если я хочу только синтезировать managedObjectContext свойство для одного из моих контроллеров представления,

 @implementation MyViewController
@synthesize managedObjectContext;
@end
  

т. Е. я не хочу синтезировать fetchedResultsController свойство или реализовывать какой-либо из NSFetchedResultsControllerDelegate методов, должен ли я по-прежнему соответствовать CPCoreDataTraits протоколу, например?

 @interface MyViewController : UIViewController <CPCoreDataTraits>
@end
  

Т.е., пока я не синтезирую fetchedResultsController свойство или не реализую какой-либо из NSFetechedResultsControllerDelegate методов, будет ли конечный результат точно таким, как если бы я только что объявил managedObjectContext свойство обычным образом, вот так?

 @interface MyViewController : UIViewController
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@end
  

Комментарии:

1. Это позволяет автоматически завершать методы при объявлении / определении методов делегирования в Xcode!

Ответ №1:

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

В примере любой класс, который хочет получить доступ к свойству fetchedResultsController, должен проверить наличие методов getter и / или setter, например, используя:

 
[myController respondsToSelector:@selector(fetchedResultsController)];
[myController respondsToSelector:@selector(setFetchedResultsController:)];
  

Если вызывающий метод не выполняет эту предварительную проверку, и ваша реализация протокола не поддерживает ни один из этих методов (потому что необязательно), тогда приложение вызовет исключение.
Итак, ваш подход верен, единственное различие в двух примерах заключается в том, что если вы не используете нотацию, то любой вызов conformsToProtocol: на вашем объекте вернет NO .