@界面:
UIImageView *myImageView;
@property (nonatomic, retain) UIImageView *myImageView;
@实现:
@synthesize myImageView;
- (void)viewDidLoad
{
[super viewDidLoad];
self.myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
}
myImageView 的引用计数是多少? 2(1 个来自 alloc,1 个来自点符号保留)或 3 个(1 个来自 alloc,1 个来自点符号保留,1 个来自@property retain)
这两个语句的引用计数是否相同?
self.myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
和
myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
此外,我假设您在 @implemenation 和 dealloc 方法中释放它们,对吗?
编辑:
我没有得到我想要的答案,可能我的问题含糊不清。我了解什么是点符号、@property、@synthesize,以及 setter 和 getter 的工作原理。我不明白的是使用“ self ”时会发生什么。没有“ self ”。关于保留计数。我实际上在 myImageView 对象上运行了 retainCount 方法,它确认了我的原始“ self ”。 case 的保留计数为两个(带有 alloc 和 property retain,所以在那里使用 autorelease 可能是个好主意)。现在这引出了另一个问题,如果我不使用自动释放,我该怎么做呢?在 viewDidLoad 中释放一次,在 dealloc 中再次释放,仍然会导致内存泄漏,对吗?
self.myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
NSLog(@"retain count dot: %d", [myImageView retainCount]);
2011-05-17 10:01:14.915 测试[1249:207] 保留计数点:2
myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
NSLog(@"retain count: %d", [myImageView retainCount]);
2011-05-17 10:03:14.715 测试 [1278:207] 保留计数:1
最佳答案
首先:您不应该对引用计数做出任何假设。充其量只会产生误导。
如果您使用属性访问 (self.myImageView = ...
),那么它将自动保留,因此您在 viewDidLoad 中泄漏了 UIImageView。你应该使用类似的东西
self.myImageView = [[[UIMageView alloc] init.... ] autorelease];
你的最后一个例子(没有“点”访问)将直接修改 ivar,所以它不会泄漏这个新实例。 但是如果您之前不释放它,它会泄漏您覆盖的旧 imageView。
我强烈建议始终使用属性访问。并且不要忘记在 dealloc 中进行清理:
[myImageView release], myImageView = nil;
有些人更喜欢 self.myImageView = nil;
但这可能有副作用。
关于ios - 圆点表示法、释放和解除分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6019973/