2

Objective Cのメモリ管理の調査から、参照カウントについて質問があります。

オブジェクト名はobj_numberです。私はそれを割り当てました

    obj_number = [[NSNumber alloc] init];

次に、このクラスの別のメソッド(Aという名前)で、

    obj_number = [dataset objectAtIndex:0];

この方法を実行しますデータセットは自動解放されます。このメソッドを実行した後、これを確認しましたobj_numberもアクセスできません。おそらく、割り当ても解除されます。

オブジェクトが1つの所有権の下にあるかどうかを確認します。したがって、親が割り当てを解除すると、そのオブジェクトも割り当て解除されますが、私の場合、所有権が2未満のobj_number(保持数は2に等しい場合があります)を想定しているので、メソッドAを使い果たして解放されるのはなぜですか。

4

3 に答える 3

1

編集: 非 ARC を使用していますか?

メソッドでは、次のようになる場合があります。

-(void)A{
    ....
    obj_number = [dataset objectAtIndex:0];
    [dataset autorelease];
}

上記では、obj_number のポインタを に変更しています[dataset objectAtIndex:0]

あなたのようにunder 2 ownership (retain count may equals to 2)

私はあなたの意図がこの価値にあるcopyことを願っていますよね?retain

その後、使用できるobj_number = [[dataset objectAtIndex:0] copy];//or retainのはその保持カウントが 2 に増加するときだけです。

于 2012-12-07T11:09:58.527 に答える
0

の setter メソッドを提供する必要があります。これは、ファイル内に a とファイル内にobj_numbera を提供することで実行できます。setter メソッドは、古い値が解放され、新しい値が保持されることを保証します。@property.h@sythesize.m

MyClass.h:

@interface MyClass : NSObject
{
    NSNumber *_obj_number;    // Use a different name for the ivar and property!
    ...
}

@property (retain, nonatomic, readwrite) NSNumber *obj_number;

...

@end

MyClass.m:

@implementation MyObject
@synthesize obj_number = _obj_number;

...

- (void)dealloc
{
    self.obj_number = nil;
    ...
    [super dealloc];
}

に割り当てるときobj_numberは、所有権を放棄する必要があります。

- (void)someMethod
{
    // We own myNumber, so release
    NSNumber *myNumber = [[NSNumber alloc] initWithUnsigned:12];
    self.obj_number = myNumber;
    [myNumber release];

    // However this is easier:
    self.obj_number = [NSNumber numberWithUnsigned:12];
}

- (void)someOtherMethod
{
    // We don't own [dataset objectAtIndex:0] so no need to release
    self.obj_number = [dataset objectAtIndex:0];
}
于 2012-12-07T11:16:07.123 に答える
0

保持数を考えるべきではありません。大切なのは所有権です。

obj_number = [[NSNumber alloc] init];

所有する新しい NSNumber インスタンスを作成します。これは、不要になったときにリリースする必要があることを意味します。

obj_number = [dataset objectAtIndex:0];

これにより、所有していないオブジェクトが得られます。あなたはそれを解放する必要はありません。所有権が必要な場合は、保持メッセージを送信し、後で解放する必要があります。

コードのもう1つのポイント。そのようなものを書くと、メモリ リークが発生します (ARC を使用しない場合):

//obj_number = [[NSNumber alloc] init]; // returns nil, so no leak
obj_number = [[NSNumber alloc] initWithInt:1];
some code // No [obj_number release] or [obj_number autorelease] here
obj_number = [dataset objectAtIndex:0];

最後の行でリークが発生します。その行の後、obj_number は、最初に割り当てた NSNumber ではなく、インデックス 0 のデータセット内のオブジェクトを指します。

編集: trojanfoe が言ったように、ほとんどの場合、プロパティはメモリ管理を行うため、プロパティを使用することをお勧めします。

于 2012-12-07T11:20:33.190 に答える