0

私は、Kochan の優れた Objc-C の本からいくつかの基本的な Objective C のメモを確認してきましたが、ポインターがクラスから作成されているが、手動で割り当てられていないコードに気付きました。

//...

int main (int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSNumber *myNumber, *floatNumber, *intNumber;
NSInteger *myInt; 

//integer value

intNumber = [NSNumber numberWithInteger: 100];
myInt = [intNumber integerValue];
NSLog (@"%li", (long) myInt);

//...

'[[class allocate] init]' なしで作成されたすべてのインスタンスに注意してください。

4

3 に答える 3

1

などのメソッド[NSNumber numberWithInteger: 100]は、オブジェクトにメモリを割り当てNSNumberます。この種のクラス メソッドは慣例により、 と同等[[[NSNumber alloc] initWithInteger: 100] autorelease]です。通常の alloc/init イディオムとの違いは、所有していないオブジェクトが返されたことです。次回の実行ループで自動的に解放されます。この違いは、自動参照カウント (ARC) を使用していない場合にのみ存在することに注意してください。手動の参照カウント環境では、この方法で一時オブジェクトを作成し、作成したルーチンでのみ使用するのが非常に便利なことがよくありますreleaseApple のMemory Management Programming Guideで、Objective C メモリ管理の詳細を読むことができます。

于 2012-08-11T06:44:34.093 に答える
1

あなたの混乱がどこにあるのかわからないので、変数と呼ばれることが多い単純なボックスから始めます。これが基本的すぎる場合はお詫びします。

あなたが書くとき:

NSInteger someNumber;

を格納するのに適したボックスを割り当て、NSINtegerこのボックスを名前で参照するように求めています。ボックスには、アドレスまたはポインタsomeNumberと呼ばれることが多い別の名前もあります。したがって、整数にスペースを割り当てました。

同様に、次のように記述します。

NSNumber *intNumber;

を格納するのに適したボックスを割り当てていますNSNumber *。これは、このボックスに他のボックスの名前 (アドレス) を含めるように指定する方法です。このボックスを name で参照するように求めていますintNumber。したがって、ポインター用のスペースを割り当てました。割り当てていないのは、NSNumber(注 no *) と名前(またはアドレスまたはポインター) を格納できるボックスですintNumber

今行:

releasePool *pool = [[NSAutoreleasePool alloc] init];

は 2 つのことを行います。左側は、最初の 2 つの例とまったく同じことを行います。ボックスを割り当て、便利な名前を付けます。poolこのボックスは、値を保持するボックスの名前を保持するのに適していNSAutoreleasePoolます。

右側のサイズは、 を使用して、値allocを保持するのに適したボックスを割り当てる式です。NSAutoreleasePoolを使用して、そのボックスに値を入れますinitボックスの名前を返します。

最後に、割り当ては RHS によって返された名前を受け取り、それを LHS によって作成されたボックスに入れます。

したがって、ステートメント全体で2 つのボックスが作成されました。

これにより、次のことがわかります。

intNumber = [NSNumber numberWithInteger: 100];

ここで、LHS は既に作成されているボックスを指定します。RHS は、ボックスの名前を返す式です。RHS 側が返す名前のボックスはどこで作成されましたか? 本当に推測することしかできませんが (numberWithIntegerもちろんソースがない限り)、それは問題ではありません。ボックスはいつか誰かによって作成され、式はその名前を返します。割り当てにより、割り当てなかったボックスの名前が割り当てられ、ボックスに割り当てられましintNumberた。あなたが知る必要があるのはそれだけです...

よくほとんど。ARC または GC を使用している場合は、ここで終了できます。MRC を使用している場合はretain、ボックスにするかどうかを知る必要がありますが、それは別の問題です...

HTH。

于 2012-08-11T06:49:07.287 に答える
0

宣言するNSInteger *myInt;_NSInteger myInt;

于 2012-08-11T06:47:17.397 に答える