这是我的代码。
- (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上进行操作。 此外,我收到内存警告,我的应用程序崩溃。
答案 0 :(得分:1)
1)显示如此,因为这是保留计数 2)是的 3)绝对不是 4)见3
的答案答案 1 :(得分:1)
retainCount
的文档以“不要使用此方法”语句开头。虽然这有点苛刻,但警告仍然存在,因为很难解释其结果。
您的问题的答案:
1)因为那是它当时的价值。值3意味着在返回的瞬间,三个对象表示对象的所有者权益,并且所有者权益仍然未完成但这些对象可能已经表明他们希望通过发布取消该权益autorelease
- 这是retainCount
不应使用的原因之一。
2)计数在给定时总是正确的,但是很难解释。
3)你永远不会尝试将计数减少到零,这与保留/释放模型完全不一致并且会造成严重破坏或更糟。规则是如果您创建它(使用alloc,或名称中包含create或copy的方法)或保留它然后您拥有所有者权益,并且必须将该所有权交给其他人或释放/自动释放该对象以取消所有者权益
4)见3,你永远不会到这里。
您应阅读有关保留/发布模型的文档并了解所有权。即使在ARC,您自动处理保留/释放,您也需要了解所有权。
HTH