検索

ホームページ  >  に質問  >  本文

objective-c - 关于iOS中引用计数的问题

我不是很明白其中“nsmutablearray类对象被赋值给变量obj,但obj自己并不持有该对象,使用retain可以持有该对象”这句话。

然后我在网上看到这个,应该是对应“非自己生成的对象,自己也能持有”这个情况,然后我写了下面的代码

NSMutableArray *array = [NSMutableArray arrayWithObjects: @"one", @"two", nil];  
NSString *elem = array[0];   
[array removeAllObjects];   
NSLog(@"%@", elem);

既然removeallobjects了就应该被dealloc了,为什么还能打印出elem呢?

还有第二种代码,person被release之后为什么还可以访问name

People *person = [[People alloc] init];
[person release];
NSString *name = person.name;
NSLog(@"%@", name);
PHPzPHPz2889日前251

全員に返信(1)返信します

  • 巴扎黑

    巴扎黑2017-04-17 17:55:18

    これは参照カウントのメカニズムの問題です。簡単に言えば、オブジェクトが alloc や copy などによって初期化されると、retainCount は 1 になります。オブジェクトが保持されるたびに、retainCount は 1 ずつ増加します。 is release,retainCount Subtract 1. オブジェクトがコレクション (配列など) に追加されると、そのオブジェクトは自動的に一度保持され、コレクションから削除されると、自動的に解放されます。 オブジェクトのretainCountが0になると、オブジェクトはいつでも解放される可能性があるため、原則としてその時点ではオブジェクトにアクセスできなくなります。

    「自分で生成していないオブジェクトも自分で保持できる」とは、自分で生成していないオブジェクトでも保持できるので、retainCountを1増やすという意味です。他に過剰な解放がなければ、リリースする前は、retainCount は少なくとも 1 であり、保持している場合と同じです。

    最後の 2 つの問題は、テスト コードが間違ったオブジェクトを使用していることです。テスト内のすべての NSString を NSMutableString または任意のオブジェクト ObjectA に置き換えることができます。

    最後の質問は、person が解放された後でも、retainCount が 0 になるはずですが、なぜ person.name にアクセスできるのでしょうか?その理由は、person ポインタが指すオブジェクトは、retainCount が 0 に達してもすぐにはクリアされないためです。この時点では、person ポインタはまだそのオブジェクトを指しており、name は an です。 NSString なのでアクセス可能です。

    返事
    0
  • キャンセル返事