入力すると
MyObject *obj = [[MyObject alloc] init];
「obj」はメモリアドレスへのポインタです。
... int を作成するときは、次のように入力します。
int x = 10;
タイプしてみませんか?
int *x = 10;
問題は、int、float などではなく、なぜオブジェクトへのポインタが必要なのかということです...
入力すると
MyObject *obj = [[MyObject alloc] init];
「obj」はメモリアドレスへのポインタです。
... int を作成するときは、次のように入力します。
int x = 10;
タイプしてみませんか?
int *x = 10;
問題は、int、float などではなく、なぜオブジェクトへのポインタが必要なのかということです...
int をある場所から別の場所に移動するのは簡単です。オブジェクトの移動には、CPU からのもう少しの作業が必要です。オブジェクトのアドレスの移動は、int の移動と同じくらい簡単です。
単純な C では、同じ理由で構造体へのポインターを処理するのが一般的です。C では、 -> 演算子を使用すると簡単になります。
スタック上に「ポインターなしで」オブジェクトを作成できる言語があります。たとえば、C++。オブジェクトをスタックに置くことの優れた点の 1 つは、スコープが終了すると自動的に割り当てが解除されることです。これは、メモリ管理に役立ちます。また、高速です。
オブジェクトをスタックに置くことの悪い点の 1 つは、スコープが終了してスタックが消えると、それらのオブジェクトの割り当てが自動的に解除されることです。また、オブジェクトは通常、ローカル変数よりも寿命が長いため、オブジェクトのメモリをどこかにコピーする必要があります。それは完全に可能ですが、問題を複雑にします。
また、スタックベースのオブジェクトで複雑になるのは、メモリのライフサイクルだけではありません。foo = bar
2 つのオブジェクト タイプの割り当てを検討します。オブジェクトが常にポインターである場合 ( Class*
)、ポインターを割り当てて、同じオブジェクトへの 2 つのポインターを取得しただけです。簡単。foo
がスタックベース ( ) の場合Class
、割り当てのセマンティクスがぼやけ始めます。元のオブジェクトのコピーで終わる可能性があります。
すべてのオブジェクトがヒープに割り当てられる (「ポインター付き」) というルールを導入すると、大幅に簡素化されます。たまたま、速度の違いはそれほど重要ではありません。また、コンパイラは、ヒープベースのオブジェクトがスコープ外になった後にそのオブジェクトの割り当てを解除するコードを自動的に挿入できるようになったため、一般的にはウィンウィンの状況です。
それが物の性質だからです。
Objective-C は C から直接派生したものです。そのため、オブジェクトはポインターと呼ばれます。メモリアドレスサイズのint型変数がポインタです。結局、メモリ内のオブジェクトは、メモリ内の構造体と大差ありません。
ただし、Objective-C で作業する場合は、これらの変数をオブジェクトのメモリ領域へのポインターではなく、オブジェクトの参照と考えることが推奨されます。システムが参照をどのように管理するかについてはあまり考えずに、Java と同じように考えてください。alloc/retain と release/autorelease の比較や、はるかに簡単な ARC ルールに従うなど、考慮すべきはるかに重要な事柄があります。
ところで:
MyObject obj;
これは、ポインターではなくオブジェクトを宣言します。Objective-C(afaik)では不可能であり、確かに合理的ではありません。しかし、それが合理的で可能であれば、構文は次のようになります。
int *x;
それはintへのポインタを作成します。それを使用するには、メモリを割り当て、そのアドレスを x に割り当てる必要があります。Objective C ではめったに合理的ではありませんが、標準 C では非常に役立ちます。
int、float のポインターも使用できます。
オブジェクトはヒープ上に作成されます。アクセスするには、アドレスが必要です。そのため、それらはポインター型です。
スタックまたはヒープ上にあるオブジェクトの違いです。int x = 10
x がスタックに追加されました。int *x = 10
それが何であれ、アドレス10へのポインターを宣言しているため、単に間違っています(おそらくあなたが望むものではないでしょう)。int *x = malloc(sizeOf(int));
CodaFi が提案したように、あなたは望むでしょう。int のサイズのヒープにメモリを割り当てます。
MyObject *obj = [[Myobject alloc] init];
舞台裏でコンパイラを使用すると、オブジェクトがヒープに割り当てられますが、基本的には同じ原則です