2011-05-16 39 views
0

@interface:点标记,发布和dealloc的

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可能是个好主意)。现在这引出另一个问题,如果我不使用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

+1

不要将保留计数看作绝对值;把它们想象成三角洲。即''alloc'产生一个对象w /引用计数+1“,”'self.myImageView = aView'在引用计数中加1“,''release'将保留计数减1”..... – bbum 2011-05-16 17:22:00

+0

@bbum ,理解,但我试图把握的是直接使用财产评估员和伊娃时的差异。我仍然必须在viewDidLoad(因为我在那里分配)释放它们,并且在dealloc中再次释放它,因为它是一个retain属性。 – s2000coder 2011-05-16 18:46:57

+2

计算你正在造成的保留并平衡每一个释放; 'alloc'是一个,通过setter对属性的赋值是另一个...所以,是的,你需要两个版本或autoreleases。这很简单,如果你保留,你必须释放。 – bbum 2011-05-16 19:25:41

回答

2

第一:你不应该对引用计数做任何假设。最好的情况是误导。

如果您使用属性访问权限(self.myImageView = ...),那么它将自动保留,因此您在viewDidLoad中泄漏UIImageView。你应该使用像

self.myImageView = [[[UIMageView alloc] init.... ] autorelease]; 

你最后一个例子(没有“点”访问)将直接修改伊娃,所以它不会泄漏这个新的实例。 但是如果您之前没有释放它,它会泄漏您覆盖的旧imageView。

我强烈建议您始终使用该属性。而且不要忘记在dealloc的清理:

[myImageView release], myImageView = nil; 

有些人喜欢self.myImageView = nil;但是这可能有副作用。

+0

对于使用属性访问的第一种情况,我必须在viewDidLoad和dealloc中释放它,对吧? (因为引用计数是2)。对于第二种情况,我不需要在viewDidLoad中释放它,只需在dealloc方法中?是我困惑的地方。 – s2000coder 2011-05-16 18:43:52

+0

基本上可以。但点语法也会正确释放旧对象 - 这是真正的建议。另外,你可能想使用self.myImageView = nil;在viewDidUnload中,但这是另一回事。内存管理编程指南是一个很好的阅读。 – Eiko 2011-05-17 09:23:07

1

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

+0

self.myImageView = alloc ...和viewDidLoad中的[myImageView版本]与myImageView = alloc ...和[myImageView版本]相同? ....并在dealloc方法中再次发布? – s2000coder 2011-05-16 18:48:30

+0

对不起,如果我上面的评论不清楚。我的意思是,对于这两种情况,你仍然需要释放两次,对吧? – s2000coder 2011-05-16 19:07:33

0

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

但是,由于它保留了对象,所以您确实需要释放原始分配。