NSXMLParserDelegate编译问题 - iPhone SDK 30. vs 4.0

sto*_*yhk 6 iphone

我的头文件定义如下:

#import <Foundation/Foundation.h>

@interface Warning: NSObject  { 
Run Code Online (Sandbox Code Playgroud)

在我的.m文件中,我做:

NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[parser setDelegate:self];
Run Code Online (Sandbox Code Playgroud)

这编译并在3.0下正常工作.

如果我尝试使用4.0编译,我会收到此错误:

没有实现'NSXMLParserDelegate'协议

如果我添加:

@interface Warning: NSObject <NSXMLParserDelegate>  { 
Run Code Online (Sandbox Code Playgroud)

它用4.0编译好,但是当我尝试用3.0编译时,我得到:

错误:找不到'NSXMLParserDelegate'的协议声明

基础框架正确找到.添加NSXMLParser.h没有帮助.

任何帮助,将不胜感激.

谢谢

Cha*_*let 4

根据库参考文档, NSXMLParser 不需要严格的 NSXMLParserDelegate 实现:

- (void)setDelegate:(id)delegate
- (id)delegate
Run Code Online (Sandbox Code Playgroud)

NSXMLParser 动态检查所需委托方法的可用性。

如果 NSXMLParser 需要 NSXMLParserDelegate 完整实现,则访问器将是:

- (void)setDelegate:(id<NSXMLParserDelegate>)delegate
- (id<NSXMLParserDelegate>)delegate
Run Code Online (Sandbox Code Playgroud)

我想这就是为什么框架中没有实际定义 NSXMLParserDelegate 协议的原因。

所以,这个界面对我来说似乎是正确的:

#import <Foundation/Foundation.h>

@interface Warning: NSObject  { 
Run Code Online (Sandbox Code Playgroud)

您所要做的就是实现您需要的委托方法。

编辑 :

您可以尝试使用预处理器宏来激活或停用协议使用声明:

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0
@interface Warning: NSObject <NSXMLParserDelegate>
#else
@interface Warning: NSObject
#endif
{
   // interface definition ...
Run Code Online (Sandbox Code Playgroud)

我没有在 4.0 上尝试过这个,但它在 3.1 和 3.2 之间的另一个例子上有效