[英]First time using Protocols - Objective-C
這是我第一次在Objective-C中使用協議,但我遇到了麻煩:這是我得到的:
我有一個ReportsReceiver.h:
@protocol ReportsReceiver
-(void)receiveData:(NSArray *)theData;
@end
我有一個MyController.h:
@interface MyController : UIViewController<ReportsReceiver,UITableViewDelegate,UITableViewDataSource> {
}
@end
我有一個MyController.m與實現的方法:
- (void)receiveData:(NSArray *)theData {
NSLog(@"received some data!");
}
然后我有一個帶有聲明的類AllUtilities.m:
Protocol *receiverProtocol;
AllUtilities.m還包含用於初始化協議的方法:
- (void)initProtocol {
receiverProtocol = @protocol(ReportsReceiver);
}
然后,在AllUtilities.m中,我打電話:
[receiverProtocol receiveData:anArray];
這使應用程序崩潰並顯示錯誤:
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
我怎樣才能解決這個問題? 謝謝!!
您應該再次閱讀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
本質上,協議是一種約定,該約定說,例如,“符合ReportsReceiver
協議的對象必須實現receiveData:
方法”。
因此,MyController.h承諾將存在receiveData:
而MyController.m則應諾。 到現在為止還挺好。
現在,您的receiver
變量並不關心接收器是什么類型的對象,只要它符合ReportsReceiver
協議即可。 您聲明的方式是:
id<ReportsReceiver> receiver;
...並且在初始化時,您可能會說:
receiver = myController;
然后像這樣調用它:
[receiver receiveData:anArray];
首先將NSObject協議添加到您自己的協議中。 您得到的警告是NSObject的方法。
@protocol ReportsReceiver <NSObject>
-(void)receiveData:(NSArray *)theData;
@end
在聲明實現協議的對象時,它應該更像:
id<ReportsReceiver> receiverProtocol;
要么
ReceiverClass<ReportsReceiver> *receiverProtocol;
如果您創建一個實現ReportsReceiver協議的對象(ReceiverClass)。
您以與分配任何其他類相同的方式分配一個實現協議的類:
ReceiverClass<ReportsReceiver> *receiverProtocol;
- (void)initProtocol {
receiverProtocol = [[ReceiverClass alloc]init];
}
@protocol指令開始聲明協議,而不是強制轉換為協議。 查看文檔以了解如何使用它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.