【问题标题】:How to call class methods on custom delegate property?如何在自定义委托属性上调用类方法?
【发布时间】:2011-11-15 09:19:02
【问题描述】:

我有一个“MyCLController”类,其属性“dataSource”是“MyCLController”类的数据源委托。 “MyCLController”类处理位置事件等,这个类需要几个方法来查询和更新几个sqlite DB表。出于这个原因,我创建了“MyCLControlerDataSourceDelegate”协议来声明数据源委托类应该实现哪些方法:

@protocol MyCLControlerDataSourceDelegate <NSObject>

@required

+ (NSArray *)getAllRegions;
+ (void)saveVisitTimeForRegionID:(NSInteger);
-(void)someInstanceMethod;

@end

这是数据源委托属性声明:

@property (nonatomic, assign) id <MyCLControlerDataSourceDelegate> dataSource;

在分配/初始化我的“MyCLController”之后,我将其 dataSource 属性与实现 MyCLControlerDataSourceDelegate 协议的类类型对象链接。

我想将“MyCLController”设计为松耦合,这样它就不必知道“dataSource”属性是什么类型的类。一切都很好,调用实例方法时,例如:

[self.dataSource someInstanceMethod];

但是调用类方法呢?我知道应该将类方法称为 [ClassName classMethod] 但这会使“MyCLController”的独立性降低。

【问题讨论】:

  • 为什么它们是类方法?如果你有一个实例,你必须为委托做,那么似乎所有的委托方法都应该是实例方法。
  • 因为,我正在做一个项目,我必须只执行我的任务,而不是打破项目的工作惯例。所有 DB 类及其查询方法都是类方法,并且这些类不是单例(除了它们使用 DB 单例),它们只是查询 DB。实际上我不需要分配/初始化任何这些类。我从用户的角度而不是从objective-c 及其限制的角度来看待这种需求。只是好奇是否有可能以其他方式进行。
  • 作为一个程序员,我也可能被认定为使用objective-c和iOS的用户,从这个角度来看,我觉得对我来说会很方便。但如果不可能,我会放弃:)

标签: iphone objective-c delegates class-method


【解决方案1】:

其中一种解决方案是在对象上调用“类”方法。它将获取一个对象的类名,然后我们可以调用它的类方法,例如:

NSArray *allRegions = [[self.dataSource class] getAllRegions];

【讨论】:

    猜你喜欢
    • 2017-03-31
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多