Objective-C中@interface的@protocol实现

时间:2010-02-11 03:39:28

标签: objective-c interface protocols

我需要开发一个应用程序,它有一个实现3个协议方法的接口。 假设协议A扩展了协议B和协议C,接口实现了协议A. 这就是我的代码的外观,

// This is in MyClass.h file

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "protocol_A"
@interface MyClass : NSObject <protocol_A>
{
}
@end

//This is MyClass.m file
#import "MyClass.h"

@implementation myClass

-(void)methodinA
{
NSLog(@"I'm in protocol_A");
}
}
-(void)methodinB
{
NSLog(@"I'm in protocol_B");
}

-(void)methodinC
{
NSLog(@"I'm in protocol_C");
}

@end

//This is protocol_A.h file
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "protocol_B.h"
#import "protocol_C.h"

@protocol protocol_A <protocol_B, protocol_C>

-(void)methodinA;
@end

//This is in protocol_B.h file
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@protocol protocol_B
   -(void)methodinB;
@end

//This is in protocol_C.h file

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@protocol protocol_C
   -(void)methodinC;
@end

我得到一个例外,我的应用程序正在崩溃......

***Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MyClass 0X323nm31>setvalue:forundefinedKey:]:this class is not key value coding-compilant for the key window'.

Plz请问我如何解决这个问题??

4 个答案:

答案 0 :(得分:2)

所以你从中得到这个(以及你得到它3次的原因)是你的协议定义有误。你有:

//This is in protocol_C.h file

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@protocol protocol_C
{
}
-(void)methodinC;
@end

您无法在协议中声明类成员:只能使用方法。因此,您不需要(并且,正如您所发现的)在协议定义中不能拥有大括号。因此,您需要这个用于协议定义:

//This is in protocol_C.h file

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@protocol protocol_C

-(void)methodinC;

@end

删除它们可以解决您的问题。

制作新文件时,我总是通过Xcode的新类文件进程,因为它经常为你提供很多方便的东西。以下是来自Xcode的新protocol_D声明的内容:

#import <Cocoa/Cocoa.h>

@protocol protocol_D


@end

希望这有帮助!

TL; DR:协议定义不能在其中的任何位置使用大括号。

答案 1 :(得分:0)

协议通常放在.h文件中;如果您计划在任何地方使用它们,请始终使用.h文件。

就像其他所有内容一样,在使用之前,您需要#import包含协议定义的.h文件。

因此,在MyClass.h中(它确实应该大写 - 类总是在Objective-C中大写),#import各种协议.h文件。

答案 2 :(得分:0)

您的protocol_A.h文件声明符合protocol_Bprotocol_C,但您尚未导入protocol_Bprotocol_C的标头。这意味着您声明符合协议,就编译器而言,protocol_A.h中不存在。您需要导入标题:

protocol_A.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "protocol_B.h"  //note these new imports
#import "protocol_C.h"

@protocol protocol_A <protocol_B, protocol_C>
-(void)methodinA;
@end

答案 3 :(得分:0)

另请参阅Apple的Communicating with Objects,其中讨论了委托,协议和选择器。虽然它在Mac OS X下列出,但大多数(如果不是全部)似乎也适用于iOS。