-1

あっちこっち、

カスタムUIViewがあります。このビューはアクティビティインジケーターとして機能しますが、UIActivityIndi​​catorViewの上のラベルとして機能します。initで、CAGradientLayerを追加します。それを割り当てて初期化し、UIViewレイヤープロパティのサブレイヤーとしてインデックス0に挿入します。私のdeallocメソッドが呼び出されたときに、コンソールに次のメッセージが表示されました。

- [CALayer release]: message sent to deallocated instance.

私のコード:

@interface LabelActivityIndicatorView ()
{
    UILabel *_label;
    UIActivityIndicatorView *_activityIndicatorView;
    CAGradientLayer *_gradientLayer;
}
@end

@implementation LabelActivityIndicatorView

//dealloc
- (void) dealloc
{
    [_label release];
    [_activityIndicatorView release];

    //even tried to remove the layer
    [_gradientLayer removeFromSuperLayer];
    [_gradientLayer release];

    [super dealloc];
}

// init
- (id) initWithFrame:(CGRect)frame
{
    if ( (self = [super initWithFrame:frame]) )
    {
        // init the label

        // init the gradient layer
        _gradientLayer = [[CAGradientLayer alloc] init];
        [_gradientLayer setBounds:[self bounds]];
        [_gradientLayer setPosition:CGPointMake(frame.size.width/2, frame.size.height/2)];

        [[self layer] insertSublayer:_gradientLayer atIndex:0];

        [[self layer] setNeedsDisplay];
    }
    return self;
}

@end

誰でもアイデアがあります。グラデーションレイヤーの割り当てと初期化を行っているので、それを解放する責任があります。いくつかのivarを割り当てて初期化し、割り当てることができるはずです。おそらく、retainを使用してプロパティを作成する必要があります。

ありがとう、

4

1 に答える 1

1

おそらく、レイヤーを割り当て/初期化するべきではありません。コンビニエンスメソッドレイヤーを使用します。

    _gradientLayer = [[CAGradientLayer layer];

次に、追加したレイヤーに所有権を取得させます。スーパーレイヤーが属するビューを解放すると、レイヤーが解放されます。

自分が作成したレイヤーへの独自の参照を保持したことはありません。親レイヤーに所有させると、美しく機能します。

于 2012-09-08T21:35:37.413 に答える