我可以在同一个类的实例方法中释放ivar吗? (目标C)

时间:2013-10-31 02:19:36

标签: objective-c memory-management

我可以在同一个类的实例方法中释放ivar吗?因为我想再次使用alloc-init。这是否与[_myNSStringIvar release];中的其他-(void)dealloc冲突?

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

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

1 个答案:

答案 0 :(得分:4)

只要您不再需要引用的对象,就可以发布。您甚至不必在发布前检查nil,因为您可以将release发送到nil

[_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中释放,新对象将被复制。