2016-10-04 3 views
1

クラスメソッドのみを含むクラスがあり、インスタンス化された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コードを書く必要がなくなったため、このようにしました(このクラスはプラグインのようなもので、書かれる必要のあるカスタムコード)。

答えて

1

これは、Objective-Cのの性質である:クラスオブジェクトです。実際には、そのメタクラスのインスタンスでもあります。メソッドは、他のインスタンスで呼び出されるのと同じ方法でクラスオブジェクトに対して呼び出されます。メッセージがオブジェクトに渡され、セレクタが参照されます。オブジェクトがクラスのインスタンスではなくクラスである場合は、何も変更されません。単純に、おそらく紛らわしいことに、最初にクラスメソッド*は、クラスオブジェクトのインスタンスメソッド*です。

また、NSObjectメタクラスはNSObjectプロトコルを実装しているため、すべてのクラスオブジェクトはrespondsToSelector:のような基本的な機能を持っています。それはデリゲートオブジェクトがデリゲートに特定のメッセージを送信できるかどうかをテストする方法なので、クラスオブジェクトは問題なくデリゲート関係に参加できます。

0

デリゲートインスタンスとしてクラスを渡しているため、動作していると思われます。クラスがオブジェクトを考慮しているので、これは(技術的に)機能します。デリゲートメソッドを呼び出すAppleのコードは、デリゲートが関連セレクタ(クラスとインスタンスを区別しない)に応答しているかどうかを確認し、単純に呼び出すかのような処理を行います。したがって、メソッドのクラス宣言が機能します。

ただし、インスタンスを正しく使用するように変更することをお勧めします。あなたがしたことはうまくいくかもしれませんが、APIがどのように動作することが期待されているのではありません。さらに、Appleがデリゲートメソッドを呼び出す方法を変更することは脆弱です。実際のインスタンスでのみ動作するようにコードを変更すると、コードが機能しなくなります。

+0

ここでは注意する必要はありません。これはObjCの仕組みです:クラス_are_instance、あなたは他のオブジェクトと同じようにメッセージを送信します。彼らが望むのであれば、アップルは「コードを変更して実際のインスタンスでしか動作しない」とは確信していません。 –

+0

Appleはデリゲートインスタンスが 'Class'型のインスタンスであるかどうかをチェックできます。それはちょうど彼らがそれをする_why_の質問を残す... – Avi

+0

彼らはそのように定義される合理的な前提の下でインスタンスメソッドとして存在するメソッドを検証する広告コードかもしれません。メソッドは呼び出されませんでした。私は実際にこのような前に、誰もクラスをデリゲートとして使用することは見たことがありません。 – drekka

関連する問題