#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 .