0
@implementation GroupedInexedViewController
{
    NSDictionary *names;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"PropertyList"
                                                 ofType:@"plist"];
    NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
    names = dict;
    [dict release];
}

'dict'の割り当て解除は'names'に影響しますか?つまり、「名前」の割り当ても解除されますか?私は別の投稿でそれが悪い習慣だと見ましたか?しかし、なぜ?

編集:ARCは無効になっています。

4

5 に答える 5

1

これまでのところ、ARC と非 ARC (MRC) の使用の違い、およびプロパティとインスタンス変数の違いについて言及している回答はないようです。

まず第一に、プロパティは実際には、インスタンス変数によってサポートされるセッター メソッドとゲッター メソッドにすぎません。のようなプロパティを設定し、そのプロパティがorself.dict = someObject;として宣言されている場合、保持されます。strongretainsomeObject

ただし、(プロパティではなく) インスタンス変数のみがあり、MRC を使用している場合は、単に書き込むdict = someObject;だけでポインターが複製されますが、参照カウントは増加しません。この後に書き込む場合は、それも無効化されていると[someObject release]想定する必要があります。 dict(これら 2 つのポインターが指すオブジェクトが実際には割り当て解除されていなくても、これは参照カウントの規則です)。

ARC を使用している場合、変数に代入すると参照カウントも 1 増加します。つまりsomeObject、参照カウントが 1 の場合、書き込みdict = someObject;によってオブジェクトの参照カウントが増加します (現在は と の両方で指されています) 。dictsomeObject

于 2012-11-15T07:05:32.923 に答える
1

つまり、ARC を使用していない場合は、はい: 割り当て解除dictが影響しnamesます。これは、割り当てnamesたシングルにポインターを割り当てているためですNSDictionary

deallocをnames保持したい場合は、次のメッセージを送信する必要があります。NSDictionarydictdictretain

names = [dict retain];
于 2012-11-15T06:52:42.887 に答える
1

release を手動で呼び出しているので、Automatic Reference Counting (ARC) を使用していないと仮定します。

ここにはいくつかの用語が混同されています。

割り当てを解除しませんnamesdictrelease を呼び出すときの参照カウントを減らしています。その参照カウントが 0 になると、メモリの割り当てが解除されます。

問題は、最初に を呼び出さずにに割り当てられdictたことです。namesretaindict

オブジェクトを保持すると、その参照カウントが増加します。

メモリ管理を処理するプロパティを作成するか*names、retain を呼び出して参照カウントを手動でインクリメントするかを選択できます。names = [dict retain];

これを行う場合は、dealloc メソッド内にdeallocメソッドも実装する必要があります。release names

于 2012-11-15T06:49:01.073 に答える
1

namesあなたのコードは の値を代入しますdictdictはオブジェクトへのポインターであるため、その値を別のポインター ( names) に代入すると、両方のポインターが同じオブジェクトを参照し、同一と見なすことができます。

そうです、 をリリースdictすると、 もリリースされnamesます。

namesところで、経由せずに直接割り当てることができますdict

names = [[NSDictionary alloc] initWithContentsOfFile:path];

また、ARC を有効にできれば、オブジェクトの解放について心配する必要はありません。

于 2012-11-15T06:49:22.803 に答える
0

dict と name は 2 つの異なる変数です。混在させないでください!!!

割り当て、コピー、可変コピー、保持する場合にのみ「解放」します。それ以外の場合は、自動解放モードで作成されます。

また、ARC を使用している場合は、これらの新しく割り当てられたすべてのスペースを「リリース」コンパイラで処理する必要はありません。

于 2012-11-15T06:48:42.397 に答える