@interface:
UIImageView *myImageView;
@property (nonatomic, retain) UIImageView *myImageView;
@implementation:
@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保留)
这两个陈述是否具有相同的引用计数?
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的工作原理。我不明白的是使用“自我”时会发生什么。没有“自我”。关于保留计数。我实际上在myImageView对象上运行了retainCount方法,它确认了我原来的“自我”。 case的保留计数为2(具有alloc和property保留,所以在那里使用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
答案 0 :(得分:2)
首先:你不应该对引用计数做任何假设。这充其量会产生误导。
如果您使用属性访问(self.myImageView = ...
),它将自动保留,因此您将在viewDidLoad中泄漏UIImageView。你应该使用像
self.myImageView = [[[UIMageView alloc] init.... ] autorelease];
您的上一个示例(没有“点”访问权限)将直接修改ivar,因此它不会泄漏此新实例。 BUT 如果你之前没有发布它,它会泄漏您覆盖的旧imageView。
我强烈建议您一直使用属性访问权限。并且不要忘记在dealloc中清理:
[myImageView release], myImageView = nil;
有些人更喜欢self.myImageView = nil;
,但这可能会产生副作用。
答案 1 :(得分:1)
答案 2 :(得分:0)
要添加到第一个答案,点符号设置器负责释放旧对象和保留新对象所涉及的内存管理。在第二种情况下,你手上会有很大的潜在内存泄漏,因为每次调用时,保留都会增加1.不是点符号设置器的情况。
但是,由于它保留了对象,因此您需要释放原始分配。