簡體   English   中英

首次使用協議-Objective-C

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM