1

私は C++ の世界から来た初心者の ObjectiveC プログラマーです。NSObject が提供するメモリ管理を理解するのは非常に難しいと思います:/

次のクラスがあるとします。

@interface User : NSObject
{
  NSString* name;
}

@property (nonatomic,retain) NSString* name;

- (id)   initWithName: (NSString*) theName;
- (void) release;

@end

@implementation User

@synthesize name

- (id) initWithName: (NSString*) theName
{
    if ( self = [super init] )
    {
        [self setName:theName];
    }
    return self;
}

- (void) release
{
    [name release];
    [super release];
}

@end

いいえ、次のコードを考慮すると、保持カウントの結果を理解できません:

NSString* name = [[NSString alloc] initWithCString:/*C string from sqlite3*/];
// (1) name retainCount = 1
User* user = [[User alloc] initWithName:name];
// (2) name retainCount = 2
[whateverMutableArray addObject:user];
// (3) name retainCount = 2
[user release];
// (4) name retainCount = 1
[name release];
// (5) name retainCount = 0

(4) で、 name の保持カウントが 2 から 1 に減少しました。しかし、これは正しくありません。name を指す配列内にまだ user のインスタンスがあります。変数の保持カウントは、参照変数の保持カウントが 0 の場合、つまり解放されずに解放された場合にのみ減少する必要があります。

4

2 に答える 2

4

オーバーライドするべきではありません。オーバーライドreleaseするだけdeallocです。の保持カウントuserがゼロに達すると、それdeallocが呼び出され、 が解放されnameます。

releaseオーバーライドの名前を に変更するdeallocと、保持カウントは期待どおりに動作します。

于 2010-03-23T23:13:27.973 に答える
2

これUserで:

- (void) release

次のようにする必要があります。

- (void) dealloc

メモリ管理を混在させnameています-各オブジェクトには独自のメモリがあります。user

4) で、 ではない独自のreleaseメソッドを呼び出すので、期待どおりに動作しないと思います。で名前を からに変更します。NSObjectreleasereleasedeallocUser

修正後、他にどのような問題があるかを確認できます。

于 2010-03-23T23:15:18.987 に答える