クラスメソッドのみを含むクラスがあり、インスタンス化されたMKMapViewオブジェクトを返します。このObjective-Cデリゲートメソッドは、クラスメソッドとして実装してもなぜ機能しますか?
私はまた、地図上の位置のイベントを処理したかったので、私はmapView:didUpdateUserLocation:
方法で実装。私はこれをやってましたが、私はこれが実際にどのように動作するか困惑になった
+ (UIView *)create{
MKMapView *mapView = [[MKMapView alloc] init];
[mapView setShowsUserLocation:YES];
mapView.delegate = [self self];
return mapView;
}
+ (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
NSLog(@"Location changed! :%@", userLocation);
}
:
のコードは次のようになります。このクラスはインスタンス化されないため、すべてのメソッドはクラスメソッドであり、これにはmapView:didUpdateUserLocation:
メソッドも含まれます。
MKMapView
のみインスタンスメソッドのバージョンなしクラスメソッドを宣言しますので、私は、これは奇妙だと思いました。それでも、このコードはうまく動作します。
私の質問は次のとおりです。これはどのように機能しますか?そして、このようにコードを書いても問題ありませんか?
p.s. 代わりにシングルトンを作成することもできましたが、このように新しいクラスごとに特別なシングルトンのinitコードを書く必要がなくなったため、このようにしました(このクラスはプラグインのようなもので、書かれる必要のあるカスタムコード)。
ここでは注意する必要はありません。これはObjCの仕組みです:クラス_are_instance、あなたは他のオブジェクトと同じようにメッセージを送信します。彼らが望むのであれば、アップルは「コードを変更して実際のインスタンスでしか動作しない」とは確信していません。 –
Appleはデリゲートインスタンスが 'Class'型のインスタンスであるかどうかをチェックできます。それはちょうど彼らがそれをする_why_の質問を残す... – Avi
彼らはそのように定義される合理的な前提の下でインスタンスメソッドとして存在するメソッドを検証する広告コードかもしれません。メソッドは呼び出されませんでした。私は実際にこのような前に、誰もクラスをデリゲートとして使用することは見たことがありません。 – drekka