-2

これが私のコードです。

- (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 で操作を行う必要があります。また、メモリの警告が表示され、アプリがクラッシュします。

4

2 に答える 2

1

1) 保持回数なのでそのように表示されます。
2) はい
3) まったくそうではない
4) 3 の回答を参照

于 2013-03-29T09:51:43.640 に答える
1

のドキュメントはretainCount、「このメソッドを使用しないでください」という文で始まります。これは少し厳しいですが、結果を解釈するのが非常に難しいため、警告があります。

質問への回答:

1) それが当時の価値だったからです。値 3 は、返された時点で 3 つのオブジェクトがオブジェクトの所有権を表明しており、所有権がまだ残っていることを意味しますが、これらのオブジェクトは、発行によってその所有権をキャンセルしたいことをすでに示している可能性がありますautorelease。理由retainCountは使用しないでください。

2) カウントは与えられた時点では常に正確ですが、解釈が非常に難しい場合があります。

3)カウントをゼロに減らそうとすることは決してありません。これは、保持/解放モデルと完全に矛盾しており、大混乱を引き起こすか、さらに悪いことになります。ルールは、それを作成する (alloc、または名前に create または copy を含むメソッドを使用する) か保持する場合、所有権があり、その所有権を他の誰かに渡すか、オブジェクトを解放/自動解放して所有権をキャンセルする必要があります。 .

4) 3 を参照してください。

保持/解放モデルに関するドキュメントを読み、所有権を理解する必要があります。保持/解放が自動的に処理されるARCの下でも、所有権を理解する必要があります。

HTH

于 2013-03-29T09:54:30.150 に答える