我在一个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,我无法访问该对象。
有什么想法吗?
答案 0 :(得分:0)
这里的代码看起来不错。 (除了内存泄漏)你将一个带有retain-count +1的ImageView分配给itemImageView,它将把它增加到两个。在将其设置为itemImageView:
后,需要在ImageView上调用releaseUIImageView* 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示例代码中看到这一点。