6

私はそれをテストしました、そしてそれはそうするように見えます。だから私の質問は、それは常に保持カウントを増やすのですか?

だから私はいつもこのようなことをします:

UIView *theView = [[[UIView alloc] initWithFrame:(CGRect)aFrame] autorelease];
[self.view addSubview:theView];

私は実際にメモリリークをしていますか?

このコード@property (nonatomic, retain) UILabel *ingredientsTextLabel;でインスタンス化するグローバルプロパティがあります。viewDidLoad

名前付きのプロパティがあり、ヘッダーにそのプロパティがないため、getterとsetterはありません。私の中でviewDidLoad

    ingredientsTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, ingredientsScrollView.frame.size.width, ingredientsScrollView.frame.size.height)];
    [ingredientsTextLabel setBackgroundColor:[UIColor clearColor]];
    [ingredientsTextLabel setFont:[UIFont fontWithName:@"Helvetica" size:18]];
    [ingredientsTextLabel setText:ingredientsText];
    [ingredientsTextLabel setNumberOfLines:0];
    [ingredientsTextLabel setLineBreakMode:UILineBreakModeWordWrap];
    NSLog(@"%i",[ingredientsTextLabel retainCount]); // here retain count is 1

    CGSize maxSize = CGSizeMake(ingredientsScrollView.frame.size.width, 9999);
    CGSize ingLabSize = [ingredientsText sizeWithFont:ingredientsTextLabel.font
                                    constrainedToSize:maxSize
                                        lineBreakMode:ingredientsTextLabel.lineBreakMode];

    [ingredientsTextLabel setFrame:CGRectMake(ingredientsTextLabel.frame.origin.x, ingredientsTextLabel.frame.origin.x, ingredientsTextLabel.frame.size.width, ingLabSize.height)];
    [ingredientsScrollView addSubview:ingredientsTextLabel];
    NSLog(@"%i",[ingredientsTextLabel retainCount]); // here retain count is 2!

これでうまくいくと思ったので、deallocでリリースできますingredientsTextLabelが、保持カウントは2なので、addSubviewの後でiもリリースする必要がありますか?私はこれが起こることに気づいていませんでした!:(

4

3 に答える 3

10

はい、「addSubview」は保持カウントを増やします。これは、スーパービューも解放されるまで解放/解放されるべきではないサブビューをメソッドが保存するため、理にかなっています。スーパービューがリリースされると、すべてのサブビューもリリースされます。

于 2010-11-12T10:59:59.350 に答える
3

-retainCountは使用しないでください。

オブジェクトの絶対保持数は無意味です。

releaseオブジェクトを保持させたのとまったく同じ回数を呼び出す必要があります。(リークが好きでない限り)それ以下ではなく、(クラッシュが好きでない限り)確かにそれ以上ではありません。

詳細については、メモリ管理ガイドラインを参照してください。

オブジェクトを+new/ + alloc / -retain / -copy(NARC)する場合は、保持とリリース(または自動リリース)のバランスをとる必要があります。物語の終わり。絶対保持数、特にフレームワーククラスからサブクラス化されたクラスフレームワークコードに渡されたクラスのインスタンスの絶対保持数は、実装の詳細であり、想定どおりではない可能性があります。

于 2010-11-13T18:04:09.360 に答える
2

実際にはそうです。これはhttp://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html#//apple_ref/occ/instm/UIView/addSubviewで参照できます。

当然のことながら、superViewはaddSubview:にsubViewを保持するため、subViewを削除すると解放されます。

于 2011-12-21T02:03:07.907 に答える