1

同じクラスのインスタンスメソッドで ivar を解放できますか? もう一度割り当て初期化したいからです。[_myNSStringIvar release];これは の他のものと競合し-(void)deallocますか?

    // in the middle of an instance method
    if(_myNSStringIvar != nil){
        [_myNSStringIvar release];
    }

    _myNSStringIvar = [[NSString alloc] initWithString:(NSString *)[aDictionary objectForKey:@"key"]];
4

1 に答える 1

4

参照されたオブジェクトが不要になったときはいつでも解放できます。に送信するnilだけでよいので、リリース前に確認する必要さえありません。releasenil

[_myNSStringIvar release];
_myNSStringIvar = [[NSString alloc] initWithString:(NSString *)[aDictionary objectForKey:@"key"]];

またalloc] init]、新しい文字列オブジェクトを作成する必要はなく、代わりに既存のオブジェクトをコピーします。

[_myNSStringIvar release];
_myNSStringIvar = [aDictionary[@"key"] copy];

aDictionary[@"key"]そうすれば、不変の場合のみ保持し、NSMutableStringオブジェクトの場合はコピーします。

属性でプロパティを使用する場合、copy手動で行う必要さえありませんrelease

@property (copy) NSString *myNSString;
...
self.myNSString = aDictionary[@"key"];

古いオブジェクトはセッターで解放され、新しいオブジェクトがコピーされます。

于 2013-10-31T02:33:00.613 に答える