如何在iPhone中创建全局协议方法?

时间:2012-10-22 09:20:38

标签: iphone ios6 protocols global

我创建了一个协议方法,我想在多个类中实现协议方法

@protocol XMLProtocol <NSObject>

- (BOOL) hasAllRequiredAttributes :(NSDictionary*)attributeMap;

@end

我使用了以下类方法

#import "XMLProtocol.h"
@interface MachineA : NSObject<XMLProtocol>

及其实现方法我将实现协议方法

- (BOOL) hasAllRequiredAttributes:(NSDictionary *)attributeMap {
  return false;
  }

我也在另一个班级使用这个协议方法

#import "XMLProtocol.h"
@interface MachineB : NSObject<XMLProtocol>

及其实现方法我将实现协议方法

- (BOOL) hasAllRequiredAttributes:(NSDictionary *)attributeMap {
  return false;
 }

我的想法是我应该在哪里调用协议方法。我完全糊涂了。我怎么能这样做。

4 个答案:

答案 0 :(得分:3)

您可以为协议方法定义全局实现的一种方法(如果我正确理解您的要求)是在NSObject上定义一个类别:

@implementation NSObject (XMLProtocol)

- (BOOL) hasAllRequiredAttributes:(NSDictionary *)attributeMap {
   return false;
}

通过这样做每个对象都将拥有该方法。不知道这是否合情合理,但这是一种方式。

另一种方法是定义一个Machine基类,MachineAMachineB都来自这个基类;协议方法将在基类中定义:

@interface Machine : NSObject <XMLProtocol>
   ...
@implementation Machine
- (BOOL) hasAllRequiredAttributes:(NSDictionary *)attributeMap {
   return false;
}
    ....
@end

@interface MachineA : Machine
 ...

如果需要,任何派生类都可以重新定义它。

这不像NSObject类别那样“全局”,但如果您可以为需要实现该协议的所有类定义基类,它可能是更好的解决方案。

答案 1 :(得分:0)

您必须在两个类中编写方法的实现,即使实现是相同的。

答案 2 :(得分:0)

在您特殊情况下,通知对您来说将是非常有用的帮助。除了广播消息之外,通知与协议的工作方式相同。所以你可以在多个班级接到这个电话。

如果你想完成协议,也很容易。只需确保您使用委托引用当前视图控制器(即obj.delegate = self)。你可以在-viewWillAppear上实现它。所以你当前的视图控制器只能调用该方法。代表只会在一个地方一次调用一种方法。

答案 3 :(得分:0)

恕我直言,全局协议对于像XML解析一样具体的设计并不是很好。

@protocol本身没有任何实现部分。它只是一个API定义,将其视为合同。任何符合协议的类都必须实现其强制方法和属性(有@optional子句)。

例如,您可能有两个XML解析器实现,一个适用于iOS 4,另一个适用于iOS 5+。两者都声明符合XMLProtocol协议。并且都实现了 - (BOOL) hasAllRequiredAttributes :(NSDictionary*)attributeMap;,让我们假设他们需要以不同的方式实现它。

由于符合XMLProtocol,您不关心实施细节。你知道你将传递一个属性映射,你将获得一个布尔值,表明它是否具有所有必需的属性。

您可以在使用这些类的地方调用该方法:

id <XMLProcotol> parser;
if (iOS4) {
    parser = [[OldXMLParser alloc] initWithString:<#...#>];
} else {
    parser = [[NewXMLParser alloc] initWithString:<#...#>];
}
/* you call the method without caring which parser class
 * has been actually created thanks to the protocol
 */
if ([parser hasAllRequiredAttributes:theMap]) {
    ...
}

如果方法的实现相同,则可以将两个实现公共父类的子类同时存在于协议中。