iOSアプリのコーディングでは、NSNumber、NSNull、...blablaの継承を禁止する潜在的な理由があることがわかりました。
これを行おうとすると、コンパイラは失敗しませんが、使用情報がないとすぐに実行がクラッシュします。理由を知っている人はいますか?
iOSアプリのコーディングでは、NSNumber、NSNull、...blablaの継承を禁止する潜在的な理由があることがわかりました。
これを行おうとすると、コンパイラは失敗しませんが、使用情報がないとすぐに実行がクラッシュします。理由を知っている人はいますか?
他のクラスクラスターと同様に、NSNumberのサブクラスを作成する場合は、そのスーパークラスであるNSValueのプリミティブメソッドをオーバーライドする必要があります。さらに、非プリミティブメソッドの抽象実装を利用するために、NSValueメソッドobjCTypeの実装が返すことができる戻り値の制限されたセットがあります。有効な戻り値は、「c」、「C」、「s」、「S」、「i」、「I」、「l」、「L」、「q」、「Q」、「f」、および「d」。
もっと正確に言えば、NSNumberのインスタンスを実際に持っていないからだと思います。Objective-Cには、クラスの初期化子が実際に自己が指すオブジェクトを変更できるという興味深い特性があります(これは実際にはどのメソッドにも当てはまりますが、initメソッドで使用されていることは聞いたことがあります)。NSNumberはまさにこれを行っていると思います。
クラスクラスタに関するドキュメントも参照してください。
うーん… NSNumberクラスリファレンスから、NSValueを適切にサブクラス化する限り、サブクラス化が許可されているようです。
サブクラス化ノート
他のクラスクラスターと同様に、NSNumberのサブクラスを作成する場合は、そのスーパークラスであるNSValueのプリミティブメソッドをオーバーライドする必要があります。さらに、非プリミティブメソッドの抽象実装を利用するために、NSValueメソッドobjCTypeの実装が返すことができる戻り値の制限されたセットがあります。有効な戻り値は、「c」、「C」、「s」、「S」、「i」、「I」、「l」、「L」、「q」、「Q」、「f」、および「d」。
NSValueにサブクラス化のメモはありませんが、NSValueにすべてのメソッドを実装する必要があると思います。