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"];

旧对象在 setter 中释放,新对象将被复制。

于 2013-10-31T02:33:00.613 回答