2

Objective-C のプリミティブ プロパティで属性を使用する必要があることはよく知られています(assign)が、なぜこれを行うのかについて明確な説明はありませんでした。

検討

[myObject setIntProperty:22];

myObjectを持つクラスの場合@property (nonatomic, assign) int intProperty;

私の想像intPropertyでは、値 22 を保持するスタック メモリへのポインタを割り当てることになると思います。したがって、そのポインタはプロパティが値を持つために生き続けなければならないので、これはすべてのプリミティブがスタック メモリ内で無制限の寿命を持つことを意味しますか?

私が理解していないことを説明するためのいくつかのコード:

MyObject.h ----

@interface MyObject : NSObject
@property (nonatomic, assign) int myInt;
@property (nonatomic, assign) NSString* myString;
@end

その他のファイル.m ----

-(void) doSomething
{
   int x = 22;
   NSString* str = @"something";

   MyObject* obj = [[MyObject alloc] init];

   obj.myInt = x;
   obj.myString = str;

   [self doSomethingInOtherFunctionWith:obj];
}

関数が完了して先に進むと、割り当てられた文字列myStringは、関数の実行後に破棄されるdoSomething関数のローカルとポインターを共有しているため、何も指しません。str,しかし、myInt は 22 のままです。

私は、これが値によって渡される仕組みであることを理解しています。どのように機能するのかは疑問ではありません。理由だけです。int は、あるレベルでポインターである必要はありませんか?

4

1 に答える 1

2

Objective-C プリミティブを常に割り当てるのはなぜですか?

できないからretainですcopy- それは、Objective-C オブジェクトのみです。

私の想像では、スタック メモリへのポインタを intProperty に割り当てます。

いいえ、そうではありません。を割り当てintています。もちろん、内部的には、インスタンス変数は int へのポインターとしてmyObjectオブジェクトに実装され、オフセットが追加されます (クラスのインスタンス変数のレイアウトによって記述されます)。

しかし、「スタック変数」が「自動ストレージ期間を持つオブジェクト [変数の C 用語]」を意味する場合は、いいえ。Objective-C オブジェクトは通常、動的に割り当てられ (「ヒープ上」かもしれませんが、実際には関係ありません)、割り当てが解除されない限り、つまり参照カウントがゼロになるまで存続します。次に、割り当てが解除され、破棄され、インスタンス変数 (対応する@propertyes をサポートする) もすべて無効化されます。

于 2013-07-14T21:19:07.270 に答える