1

UIViewControllerいくつかのポイントを達成するために、のサブクラスとしてクラスクラスターを作成しようとしています:

1.実際の iOS バージョンによる ViewController の動作の違い

2. iOS のバージョン チェックでコードが乱雑にならないようにする

3.発信者は気にする必要はありません

これまでのところ、クラスMyViewControllerMyViewController_iOS7およびを取得しましたMyViewController_Legacy

インスタンスを作成するには、次のmyViewControllerWithStuff:(StuffClass*)stuffように実装されているメソッドを呼び出します。

+(id)myViewControllerWithStuff:(StuffClass*)stuff
{
    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
    {
        return [[MyViewController_iOS7 alloc] initWithStuff:stuff];
    }
    else
    {
        return [[MyViewController_Legacy alloc] initWithStuff:stuff];
    }
}

呼び出し元は を使用しmyViewControllerWithStuff:ます。その後、そのように作成されたビュー コントローラがUINavigationControllerのナビゲーション スタックにプッシュされます。

これは、大きな欠点が 1 つありますが、ほぼ意図したとおりに機能します。ARC はMyViewController_xxx、ナビゲーション スタックからポップされたインスタンスの割り当てを解除しません。iOSのバージョンは問いません。

私は何が欠けていますか?

更新: -initWithStuff:

-(id)initWithStuff:(StuffClass*)stuff
{
    if (self = [super init])
    {
        self.stuff = stuff;
    }

    return self;
}

このメソッドは にも実装されていMyViewControllerます。違いは後で発生します (例: viewDidLoad:)。

4

1 に答える 1

0

まず第一に:すべての助け、コメント、回答、提案に感謝します...

もちろん、オブジェクトstrongへの別の参照がありましたMyViewController。しかし、これはプロパティ変数でもインスタンス変数でもないため、それほど明白ではありませんでした。

で、viewDidLoad次のことを行いました。

[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillResignActiveNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
    [self saveState];
}];

これにより、ユーザーがアプリをバックグラウンドに送信した場合のデータ損失を防ぐことができます。もちろん、ブロックはその環境の必要な部分をキャプチャします。この場合、キャプチャされましたself。ブロックはself、それ (ブロック) が破壊されるまで生き続けます。これは、たとえば[[NSNotificationCenter defaultCenter] removeObserver:self];呼び出された場合です。しかし、残念ながら、この呼び出しは、ブロックが存在する限り呼び出されないdeallocメソッドに配置されます...MyViewController

修正は次のとおりです。

__weak MyViewController *weakSelf = self;
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillResignActiveNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
    [weakSelf saveState];
}];

これで、ブロックが をキャプチャしweakSelfます。この方法では、オブジェクトを存続させることができずMyViewController、すべてが解放され、正常に動作します。

于 2014-05-05T22:14:15.430 に答える