0

私はこのように宣言されたmySegmentedと呼ばれるこのプロパティを持っています

.h
@property (retain)  UISegmentedControl *mySegmented;


.m
@synthesize mySegmented = _mySegmented;

すると、次のように作成されました。

self.mySegmented = [self createSegmented];
// createSegmented creates an autoreleased segmented control

私のアプリには 3 つの異なるセグメント化されたコントロールがあります。一度に 1 つだけ表示されます。アプリのある時点で、特定のセグメント化されたコントロールを非表示にする必要があるため、すべてのセグメント化されたコントロールの配列を構築して反復する必要があります...これはブロック内にあります。

[UIView animateWithDuration:0.8

             animations:^{

                 NSArray *list = [NSArray arrayWithObjects:
                                  self.mySegmented1,
                                  self.mySegmented2,
                                  self.mySegmented3,
                                  nil];

                 for (UISegmentedControl *oneSeg in list) {
                     [oneSeg setAlpha:0.0f];
                 }

             }];

何が起こるか: しばらくすると、このアレイを構築しようとしているときにアプリがクラッシュします。セグメント化されたコントロールの 1 つが何らかの形で割り当て解除されていると思います。コードで確認できる割り当て解除はありません。

私の質問は次のとおりです。作成中のこのアレイは自動解放されます。ブロックがアニメーションを終了するとどうなりますか? リリースはアレイの各メンバーに送信されますか?

セグメント化されたコントロールを作成した後に保持すると、Xcode はそれがリークすることを訴えます。

手がかりはありますか?

ありがとう。

4

1 に答える 1

2

試したように保持してください。ただし、必ずdeallocメソッドでそれらを解放してください。Xcode はそのように文句を言うべきではありません。

配列もブロック内で自動解放されますが、それで問題ありません。配列はその内部の参照を所有していません。実際の問題は、セグメント化されたコントロールがView Controllerによって保持されないことです。

それがどうなるか教えてください。

于 2012-05-13T01:26:31.597 に答える