1

私はまだこれを理解していないと思います。このプロジェクトではARCを使用していません。

保持属性で宣言されたプロパティの場合aProperty、割り当てられたオブジェクトが次のステートメントで2回保持されることを期待します。

self.aProperty = [UIView alloc] init...];

割り当てから1回、セッターによって1回。

したがって、次のように、オブジェクトをすぐに解放します。

self.aProperty = [UIView alloc] init...];
[self.aProperty release];

コンパイラはエラーメッセージを出します:

この時点で呼び出し元が所有していないオブジェクトの参照カウントの誤ったデクリメント。

その時点で、保持カウントはセッターによって増分され、2になりますか?

また、「その時点で発信者が所有していない」とはどういう意味ですか?これは私がよく知らない問題かもしれません。

4

2 に答える 2

1

オブジェクトが単純な変数として宣言されているのではなく、他の何か(この場合はself)によって所有されているために警告され、オブジェクトがランダムに解放されないようにしたい場合があります。

これを試してください:

UIView *view [UIView alloc] init...];
self.aProperty = view;
[view release];

またはこれ、私が通常行うこと:

self.aProperty = [[[UIView alloc] init] autorelease];
于 2012-04-14T15:00:12.230 に答える
0

何が起こっているのかを明確にするため。

self.myVar = [[UIView alloc] initWithFrame:frame];

呼び出すのと同じです

[self setMyVar:[[UIView alloc] initWithFrame:frame]];

with holdを使用する@propertyと、その実装は次のようになります(これは大まかな例です)

- (void)setMyVar:(UIView *)myVar;
{
    if (_myVar != myVar) {
        [_myVar release];
        _myVar = [myVar retain];
    }
}

だから今、私たちはそれを言うことができます

+----------- +1 retain ------------+
|                                  |
[[UIView alloc] initWithFrame:frame]

+------ +1 retain ----+
|                     |
_myVar = [myVar retain];

これはカウントで+2です。次に、次のようなものがあります

- (void)dealloc;
{
    [_myVar release];
    [super dealloc];
}

これは-1であり、stil +1の保持があるため、メモリリークが発生します。

私が好むパターンは

UIView *myVar = [[UIView alloc] initWithFrame:frame];
self.myVar = myVar;
[myVar release]; myVar = nil;

これにより、メモリができるだけ早く解放され、ダングリングポインタが残りませんnil

于 2012-04-14T15:31:15.883 に答える