Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSXMLParserDelegate compile problem - iPhone SDK 30. vs 4.0

Tags:

iphone

My header file is defined like this:

#import <Foundation/Foundation.h>

@interface Warning: NSObject  { 

In my .m file I do:

NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[parser setDelegate:self];

This compiles and works just fine under 3.0.

If I try to compile with 4.0 I get this error:

does not implement the 'NSXMLParserDelegate' protocol

If I add:

@interface Warning: NSObject <NSXMLParserDelegate>  { 

It compiles fine with 4.0, but when I try to compile with 3.0 I get:

error: cannot find protocol declaration for 'NSXMLParserDelegate'

The Foundation framework is found correctly. Adding NSXMLParser.h doesn't help.

Any help would be appreciated.

Thanks

like image 515
stoutyhk Avatar asked Jun 03 '10 13:06

stoutyhk


2 Answers

According to the library reference documentation, NSXMLParser doesn't require a strict NSXMLParserDelegate implementation :

- (void)setDelegate:(id)delegate
- (id)delegate

NSXMLParser checks needed delegate methods availability on the fly.

If NSXMLParser was requiring a NSXMLParserDelegate full implementation, the accessors would be :

- (void)setDelegate:(id<NSXMLParserDelegate>)delegate
- (id<NSXMLParserDelegate>)delegate

I guess that's why there is no NSXMLParserDelegate protocol actually defined in the framework.

So, that interface seems correct to me :

#import <Foundation/Foundation.h>

@interface Warning: NSObject  { 

All you have to do is implement the delegate methods you need for.

Edit :

You could try using preprocessor macros to activate or deactivate the protocol usage declaration :

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0
@interface Warning: NSObject <NSXMLParserDelegate>
#else
@interface Warning: NSObject
#endif
{
   // interface definition ...

I didn't try this with 4.0, but it worked on another example between 3.1 and 3.2

like image 54
Charly Caulet Avatar answered Nov 03 '22 15:11

Charly Caulet


I was able to fix this with:

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0
@protocol NSXMLParserDelegate
@end
#endif
@interface Warning: NSObject <NSXMLParserDelegate>

Just be sure to implement the appropriate methods in your implementation.

like image 38
benvolioT Avatar answered Nov 03 '22 17:11

benvolioT