点符号,释放和dealloc

时间:2011-05-16 15:54:07

标签: ios objective-c memory-management

@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

3 个答案:

答案 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)

不,他们不一样。第一个“保留”,从而增加引用计数。所以要么你先将它分配给一个临时变量然后释放(在第一种情况下)[或者,添加'autorelease'并离开没有临时变量],或者你检查是否已经分配了imageView(如果有的话 - 在第二种情况下释放它。

答案 2 :(得分:0)

要添加到第一个答案,点符号设置器负责释放旧对象和保留新对象所涉及的内存管理。在第二种情况下,你手上会有很大的潜在内存泄漏,因为每次调用时,保留都会增加1.不是点符号设置器的情况。

但是,由于它保留了对象,因此您需要释放原始分配。

相关问题