简单地符合Objective-C协议可以做什么吗?

时间:2011-10-26 20:41:42

标签: objective-c uikit protocols

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 个答案:

答案 0 :(得分:3)

正如您在协议声明中所看到的,您的类对这两个属性的实现是可选的,因为这两个属性已在@optional语句下声明。 这意味着任何其他将使用符合此协议的对象的类必须在使用之前检查可选方法或属性的有效实现。

在该示例中,任何想要访问fetchedResultsController属性的类都必须检查是否存在getter和/或setter方法,例如使用:


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

如果调用方法没有执行此初步检查,并且您的协议实现不支持任何这些方法(因为可选),那么应用程序将引发异常。 所以你的方法是正确的,两个例子的唯一区别是,如果你不使用符号而不是任何对conformsToProtocol的调用:在你的对象上将返回NO。