Objective-c - 当我更改View时保留计数变为零

时间:2010-12-08 20:16:31

标签: iphone objective-c sdk retaincount

我在一个viewcontroller中声明了一个UIImage和一个UIImage视图:

在.h文件中:

UIImageView* itemImageView;
UIImage* itemImage;

@property (nonatomic, retain) UIImage* itemImage;
@property (nonatomic, retain) UIImageView* itemImageView;

在.m文件中:

@synthesize itemImage, itemImageView;

在另一个视图中,我设置了它的值:

UIImage *image = [UIImage imageNamed:@"name1.png"];
imgView.itemImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];
imgView.itemImageView.image = image;

[self.parentViewController.view addSubview:imgView.itemImageView];
[self dismissModalViewControllerAnimated:YES];  

在此方法中,itemImageView的保留计数为2。

但是当我回到我放置属性和合成的视图时,保留计数为0,我无法访问该对象。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

这里的代码看起来不错。 (除了内存泄漏)你将一个带有retain-count +1的ImageView分配给itemImageView,它将把它增加到两个。在将其设置为itemImageView:

后,需要在ImageView上调用release
UIImageView* iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];
imgView.itemImageView = iv;
[iv release];

然而,这并不能解决您的问题(甚至会使情况变得更糟......) 你能展示更多代码吗?您是否尝试使用调试器单步执行它?

答案 1 :(得分:0)

你的问题在于这一行:

[self.parentViewController.view addSubview:imgView.itemImageView];

这很可能会被编辑为:

[self.parentViewController.view addSubview:self.parentViewController.itemImageView];

这导致了imgView是否真的等同于parentViewController.view的问题。如果你想要它,那么你需要找出分配的位置,看看你搞砸了哪里。如果没有,那么在分配它之前,除了临时容器之外没有必要使用它来构建你的对象。

编辑:内存泄漏是一个单独的问题是的,但我不确定你是如何在方法中声明imgView所以我离开了你的解决方案:))

答案 2 :(得分:0)

UIImageView* itemImageView;
...
@property (nonatomic, retain) UIImageView* itemImageView;
...
imgView.itemImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];

这会导致双重保留,因为alloc会将保留计数器增加1,retain的{​​{1}}设置也会增加。

设置属性的一般模式如下:

·H:

@property

的.m:

SomeClass* someClass;
...
@property (nonatomic, retain) SomeClass* someClass;

在这里,我们使用临时变量来保存我们分配的对象,然后立即执行释放。

您肯定会在Apple示例代码中看到这一点。