b1o*_*nic 0 macos memory-management objective-c
我想将自定义对象分配给实例变量.
这是代码:
- MyController.h/.m
#import "CustomData.h"
@interface MyViewController : NSViewController
@property (retain) CustomData* theData;
- (void)aRandomMethod;
@end
@implementation MyViewController
@synthetize theData;
- (void)aRandomMethod {
NSData* rawData = [someOtherObject someOtherMethod];
// option 1
self.theData = [[CustomData alloc] initWithData:rawData];
// option 2
CustomData* _theData = [[Custom alloc] initWithData:rawData];
// option 3
self.theData = [[[CustomData alloc] initWithData:rawData] autorelease];
// option 4
theData = [[CustomData alloc] initWithData:rawData];
// ... later code calls some methods on theData or _theData, not useful here.
}
@end
Run Code Online (Sandbox Code Playgroud)
当在Xcode中运行Analyze功能时,它告诉我,对于选项1和2,有一个"泄漏的对象未被引用...",但是对于3和4没有.看来我autorelease在使用时需要自定义对象二传手.我知道autorelease在返回我们在方法中拥有的对象时需要使用它.
你能解释一下每个选项为什么是错的还是对的?谢谢.
选项1是错误的,因为你alloc是该方法中的对象,所以该方法现在拥有该对象,因此需要release它.当你把它分配给一个属性时,retain它就是release它,当它完成它时它就是它.
出于同样的原因,选项2是错误的.你取出它的属性部分,但因为你创建了对象alloc,你负责release在该方法中调用它.
选项3是正确的,因为在将autorelease它提供给属性之前你已经使用它,因此该方法不再拥有它.请注意,如果你release在这里使用它会破坏,因为它会release在属性获得机会retain之前.
备选方案4可能是正确的; 我假设它正在将它分配给ivar.如果您稍后在dealloc方法中手动释放ivar,那么这是正确的.通过房产通常会更好.否则,您将面临分配其他值并忘记release现有值的风险.
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |