6

Bluetooth通信をテストするアプリを試してみました。ある iDevice から別の iDevice にテキスト形式でメッセージを送信するだけのシンプルなアプリです。当初、このアプリには約 6 つの警告がありましたが、2 つを除いてすべて修正しました。それらは同じですが、異なるデリゲートを扱います。1 つは GKPeerPickerControllerDelegate 用で、もう 1 つは GKSessionDelegate 用です。次のように入力すると、 Picker エラーが picker という名前の GKPeerPickerController に対するものであるとします (より完全な例を次に示します)。

picker.delegate = self;

コンパイラは次のように述べています。

'*const___strong' を互換性のない型 'id' のパラメーターに渡します。

GKSession の名前付きセッションの場合、次のように入力します。

session.delegate = self;

コンパイラに次のように言わせます。

'*const___strong' を互換性のない型 'id' のパラメーターに送信しています。

これらは、送信するボタンと peerPickerController のみに表示されます。これらの警告がアプリの機能を妨げないことはわかっていますが、これを Xcode 4.2 用に完全に更新したいと考えています。このアプリは、もともと iOS 3.0 が新しくなったときに Xcode 用に作成されました。はい、コードを書いたり練習したりすることに関しては、私は少しうるさいです。可能な限り、エラーや警告を含めてはなりません。

これらは、警告が発生するコード ブロックです。

-(IBAction)btnConnect:(id)sender{
    picker = [[GKPeerPickerController alloc] init];
    picker.delegate = self;  //Warning here
    picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;

    [connect setHidden:YES];
    [disconnect setHidden:NO];
    [picker show];
}

-(void)peerPickerController:(GKPeerPickerController *)PCpicker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session{
    self.currentSession = session;
    session.delegate = self;  //Warning here
    [session setDataReceiveHandler:self withContext:nil];
    PCpicker.delegate = nil;

    [PCpicker dismiss];
}

編集:

ヘッダーにはこれがあります:

    @interface BTViewController : UIViewController{
GKSession *currentSession;
IBOutlet UITextField *txtMessage;
IBOutlet UIButton *connect;
IBOutlet UIButton *disconnect;

GKPeerPickerController *picker;

}

4

2 に答える 2

5

私は、クラスが何であれ、正式なプロトコルselfを採用していない可能性があると信じています。インターフェイスヘッダーを投稿できますか?GKPeerPickerControllerDelegateGKSessionDelegate

編集

id にキャストすると警告がクリアされますが、実際には何も「修正」されていません...クラスヘッダーを見ると、デリゲートが期待するプロトコルを採用していません。

これらのプロトコルを採用するようにインターフェイスを変更します。

@interface BTViewController : UIViewController <GKPeerPickerControllerDelegate, GKSessionDelegate> {
于 2012-01-04T19:54:41.213 に答える
3

どうですかsession.delegate = (id)self。const____strong の代わりに ID として self をキャストする必要があるかもしれません。

編集:OPの要請により、説明が整いました。プロトコル自体は文字通り id 自体に型キャストされるため、型 id はプロトコルに必要です (id<GKSessionDelegate>など)。私の理論 (私は自分のプロジェクトで ARC を使用していないため) は、コンパイラが非常に厳密になるため、クラスが安全にリリースされることを保証できるというものです。おそらくID以外の方法でクラスを初期化しました...もちろん、誰かが知っていれば、その方法はわかりません。この回答を編集させていただければ幸いです。

編集 2: Teddy が言ったように、ヘッダー ファイルにプロトコルを採用すると、この警告も消えます。あなたがプロトコルを採用したことをほのめかしたと思って申し訳ありません。

于 2012-01-04T19:48:07.157 に答える