概要
iOSアプリの開発をしていて分からないコードを調べると、よくNSObjectというものを継承したクラスを目にします。
今までは特に気にすることなく写していましたが、ふとこのNSObjectが何者で、どんな働きをするのかが気になったので、少し調べてみましたのでまとめます。
筆者はSwift歴1年でObjective-Cの知識は全くありません。
そのため間違った理解をしている可能性があります。もし間違いを発見しましたら、指摘していただけると幸いです。
NSObjectとは
そもそもNSObjectとは何でしょう。
Appleの公式ドキュメントでは、以下のように説明されています。
The root class of most Objective-C class hierarchies, from which subclasses inherit a basic interface to the runtime system and the ability to behave as Objective-C objects.
訳:ほとんどのObjective-Cのクラス階層のルートクラスで、サブクラスはランタイムシステムへの基本的なインターフェースとObjective-Cのオブジェクトとして動作する能力を継承するものである。
引用: Apple公式Document - NSObject
ざっくり説明すると、NSObjectとはObjective-Cのルートクラスのことです。
Cocoaフレームワークのオブジェクトのほとんど全てが、このNSObjectを継承しています。全てのオブジェクトの元になるので、ルートクラスです。
そもそもNSって何?
本題とは関係ないのですが、Objective-Cのクラス名の冒頭には「NS」がつきがちです。
このNSとは何なのでしょう。
これはスティーブ・ジョブズがAppleを追放された後に作ったNext社という会社の、NextStepという製品の開発にObjective-Cが使われたからです。
NS = NextStepだったんですね。
使用用途は?
Objective-CのAPIを使用する必要がある場合
SwiftでObjective-Cで書かれたライブラリやフレームワークを使用する場合は、NSObjectを継承する必要があります。
NSObjectを継承することで、Objective-Cとの互換性を持たせることができます。
NSObjectはSwiftとObjective-Cとを繋ぐ架け橋というわけです。
KVC(Key Value Cording)を使用する場合(曖昧)
KVCとは、オブジェクトの属性値に対して、プロパティや変数から間接的にアクセスする方法です。
Objective-Cは動的型付け言語で、ランタイム時の柔軟性が特徴です。
NSObjectを継承することで、この柔軟性をSwiftも享受することができます。
この柔軟性のおかげでKVCが実現できるらしいです(?)。
そしてこのKVCという技術が開発の際によく使うIBOutletなどに使われているっぽいです。
もう少し詳しく知りたい方は👉NSObjectについてちょっと深堀りしてみた
まとめ
NSObjectはObjective-C時代の産物なので、どうやら自分で新しくコードを書くときはできるだけ使わない方が良いらしいです。
とはいえ、開発をしているとどうしても使用しなければいけない場面もあると思います。その際にNSObjectがどういった働き、役割をしているのか知っていれば安心して使えます。
個人的には、とりあえずNSObjectはSwiftとObjective-Cを繋ぐ架け橋、という認識でいれば間違いなのかなと思います。
最後まで読んでいただきありがとうございました!😊
参考記事
👇かなり参考になりました。