我可以在同一个类的实例方法中释放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"]];
答案 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中释放,新对象将被复制。