0

我在一个视图控制器中声明了一个 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,我无法访问该对象。

知道发生了什么吗?

4

3 回答 3

0

你这里的代码看起来不错。(除了内存泄漏)您将一个具有保留计数 +1 的 ImageView 分配给 itemImageView,这会将其增加到两个。将 ImageView 设置为 itemImageView 后,您需要在 ImageView 上调用 release:

UIImageView* iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];
imgView.itemImageView = iv;
[iv release];

但是,这并不能解决您的问题(它甚至会使情况变得更糟..)您能显示更多代码吗?您是否尝试过使用调试器逐步完成它?

于 2010-12-08T20:49:47.477 回答
0

你的问题是这一行:

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

这很可能应该这样编辑:

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

这就引出了imgView是否真的等同于parentViewController.view的问题。如果你想要它,那么你需要弄清楚它被分配到哪里,看看你在哪里搞砸了。如果没有,那么除了在分配它之前在其中构建你的对象的临时容器之外,将它用于任何其他东西都没有任何意义。

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

于 2010-12-08T20:50:21.183 回答
0
UIImageView* itemImageView;
...
@property (nonatomic, retain) UIImageView* itemImageView;
...
imgView.itemImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];

这会导致双重保留,因为alloc将保留计数器增加 1,而 . 的retain设置也是如此@property

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

。H:

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

米:

SomeClass* temporarySomeClass = [[SomeClass alloc] init];
self.someClass = temporarySomeClass;
[temporarySomeClass release];
...

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

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

于 2010-12-08T20:50:40.417 回答