【发布时间】:2013-03-19 23:58:39
【问题描述】:
这是我的代码。
- (void)viewDidLoad{
[super viewDidLoad];
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 240, 280)];
[view setTag:101];
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 220, 260)];
[view setBackgroundColor:[UIColor redColor]];
[view addSubview:imgView];
[self.view addSubview:view];
[self getimageFromView:view];
[view release];
[imgView release];
[self getimageFromView];
}
-(void)getimageFromView:(UIView *)view{
for (UIView *view123 in [view subviews]) {
if ([view123 isKindOfClass:[UIImageView class]]) {
UIImageView *imgView = (UIImageView *)view123;
imgView.image = [UIImage imageNamed:@"img.png"];
NSLog(@"retain cnt 1 = %d",[imgView retainCount]);
}
}
}
-(void)getimageFromView{
for (UIView *view in [self.view subviews]) {
if (view.tag == 101) {
for (UIView *view123 in [view subviews]) {
if ([view123 isKindOfClass:[UIImageView class]]) {
UIImageView *imgView = (UIImageView *)view123;
imgView.image = [UIImage imageNamed:@"img.png"];
NSLog(@"retain cnt 2 = %d",[imgView retainCount]);
}
}
}
}
}
nslog 如下所示
retain cnt 1 = 3
retain cnt 2 = 2
现在我的问题
1) Why UIImageView's object retain count is displayed like this ?
2) Is that correct count ?
3) If yes how can i send the release message till it become 0 ?
4) Can I do like this ? Is this proper way ?
for(int i=0;i<[imgView retainCount];i++){
[imageView release];
}
我有很多这样的视图,并且必须对 UIImageView 进行操作,如图所示。 我也收到内存警告,我的应用程序崩溃了。
【问题讨论】:
-
尝试继承UIImageView并覆盖retain(不要忘记[super retain])并在这个方法中设置断点,看看它什么时候retain。
-
@KenThomases:你确定吗?我不这么认为。它是 iOS 开发中一个非常基本且重要的概念
-
@Yogi 是的,他很确定,而且我确信这对开发人员来说毫无用处。您应该关心的是“相对保留计数”(意味着平衡您的保留与发布),而不是
retainCount返回的“绝对保留计数”。 -
(如果你希望看到retain cnt 1=2,retain cnt 2=1,这与内部API工作有关)这是我们应该使用内存管理规则的原因,我们应该释放我们唯一拥有的对象
标签: iphone ios objective-c ipad retaincount