第一次使用Protocols - Objective-C

Cod*_*Guy 2 iphone methods protocols ios

这是我第一次在Objective-C中使用Protocols,我遇到了麻烦:这就是我所拥有的:

我有一个ReportsReceiver.h:

@protocol ReportsReceiver


-(void)receiveData:(NSArray *)theData;

@end
Run Code Online (Sandbox Code Playgroud)

我有一个MyController.h:

@interface MyController : UIViewController<ReportsReceiver,UITableViewDelegate,UITableViewDataSource> {

}
@end
Run Code Online (Sandbox Code Playgroud)

我有一个MyController.m与实现的方法:

- (void)receiveData:(NSArray *)theData {
    NSLog(@"received some data!");
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个AllUtilities.m类声明:

Protocol *receiverProtocol;
Run Code Online (Sandbox Code Playgroud)

AllUtilities.m还包含初始化协议的方法:

- (void)initProtocol {
    receiverProtocol = @protocol(ReportsReceiver);

}
Run Code Online (Sandbox Code Playgroud)

然后在AllUtilities.m中我打电话:

[receiverProtocol receiveData:anArray];
Run Code Online (Sandbox Code Playgroud)

哪个应用程序崩溃了错误:

2011-01-07 11:46:27.503 TestGA[91156:207] *** NSInvocation: warning: object 0x9c28c of class 'Protocol' does not implement methodSignatureForSelector: -- trouble ahead
2011-01-07 11:46:27.504 TestGA[91156:207] *** NSInvocation: warning: object 0x9c28c of class 'Protocol' does not implement doesNotRecognizeSelector: -- abort
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?谢谢!!

zou*_*oul 5

您应该再次阅读Objective-C指南中有关协议的部分:)我认为您并不真正了解协议的工作原理.这就是你想要的:

// DataProducer.h
@protocol DataConsumer
- (void) handleData: (NSArray*) data;
@end

@interface DataProducer
@end

// DataProducer.m
@implementation DataProducer

- (void) generateDataAndPassTo: (id <DataConsumer>) consumer
{
     NSArray *data = …;
     [consumer handleData:data];
}

// SomeController.h
#import "DataProducer.h"

@interface SomeController <DataConsumer>
@end

// SomeController.m
@implementation SomeController

- (void) requestData
{
    // The producer is of type DataProducer.
    // Where you get it is irrelevant here.
    [producer generateDataAndPassTo:self];
}

- (void) handleData: (NSArray*) data
{
    NSLog(@"Got data.");
}

@end
Run Code Online (Sandbox Code Playgroud)