17

iOS5とARCをいじるのは初めてです。これまでのところ、それはうまくいきますが、私はある種の問題に遭遇しました。

UIStoryboardSegueFacebook Connect(または他のサービス)を使用してユーザーをアプリにログインさせる習慣があります。簡単に言えば、次のようにする必要があります。

  1. ユーザーがボタンをクリックします
  2. ボタンはセグエを発射します
  3. セグエは非同期ログインを開始しますが、ViewControllerをすぐにはプッシュしません
  4. ログインが成功した場合にのみ、セグエがViewControllerをプッシュします

代わりに、ログインが開始されますが、セグエは完了する前にARCによってすぐに解放されます。

私はこれを防ぐために素早く「汚い」ハックを考えました:

@interface BSLoginSegue() {
    __strong BSLoginSegue *_retained_self;
}
@end

// Stuff...
// Other stuff...

- (void) perform {
    login();
    _retained_self = self;
}

- (void) loginServiceDidSucceed:(BSLoginService *)svc {
    ...
    _retained_self = nil;
}

実はそれはハックなので、他にもっとエレガントな方法で同じことができるのではないかと思っていました。

4

4 に答える 4

9

並行性のためにGrandCentralDispatch (GCD)を使用する場合(これは素晴らしいです!)、 Objective-Cブロックにオブジェクトへの参照を配置し、それをGCDに渡すことにより、オブジェクトはブロックによって自動的に保持されます。ブロックが実行され、それ自体が解放されました。

非同期操作をどのように行っているかを正確に知らなければ、明確な答えを出すのは困難ですが、ブロックGCDを使用することで、これについてまったく心配する必要はありません。ブロックはそれが参照するオブジェクトの保持を処理し、ARCが残りを実行します。

UIStoryboardSegueサブクラスを呼び出すには、サブクラスへの参照をどこかに保存する必要があるようですloginServiceDidSucceed:。したがって、強力な参照を作成するだけで機能する可能性があります。繰り返しになりますが、ブロック(ログインが成功したときの完了ブロックなど)から参照するのが理想的です。成功/失敗のコールバックにブロックを使用するようにログインコードを調整することをお勧めします。

于 2012-05-10T13:49:34.217 に答える
3

クラスがそれ自体を保持する必要があるという考えは、設計上の問題がある可能性があることを示唆しています。オブジェクトがそれ自体を保持すると、誰がそれを所有しているのか、誰がそれを参照しているのかが不明確になり、リークのリスクが高くなります。

セグエを提示する責任があるのはどのクラスですか?ボタンが含まれているのと同じクラスですか?このクラスは、セグエを保持し、セグエを提示し、セグエが完了したとき/完了した場合にセグエを解放する必要があります。

ビューコントローラの階層についてさらに洞察がなければ、具体的なアドバイスを提供することは困難です。しかし、私の最初の反応は、セグエを提示するかどうかを決定しているビューコントローラーがセグエに強い特性を持つべきであることを示唆することです。サブクラス化されたセグエは、提示するクラスが準拠するプロトコルを定義して、セグエをいつ解放/解放するかについてアドバイスすることができます。

于 2012-05-10T16:01:53.920 に答える
1

次のようselfに、のデータメンバーである配列に追加および削除するだけです。self

@interface MyClass
{
    NSMutableArray* _selfRetains;
}
@end

@implementation MyClass
-(id)retainSelf
{ 
    [_selfRetains addObject:self];
    return self;
}
-(void)releaseSelf
{
    [_selfRetains removeLastObject];
}
@end

[self retain]次に、と[self retainSelf][self release]に置き換え[self releaseSelf]ます。

他の答えは正しいですが、通常、クラスがそれ自体を保持する必要がある設計は避ける必要がありますが、この回避策では、アプリの設計を大幅に変更する必要はありません。

于 2013-11-04T08:51:58.430 に答える
-2

非同期操作でセルフインスタンスを保持する必要がある場合は、シングルトンを選択できます。

于 2014-09-12T02:48:10.847 に答える