3

私はいくつかのアクションを実行する必要がある制御親クラスを持っています。これらのアクションは通常、非常に短い寿命を持っています。私は Factory クラスを使用してこれらのオブジェクトを作成していますが、それらの終焉を最もよく管理する方法と、複数のオブジェクトが安全に共存できるかどうかについていくつか質問があります。ここにいくつかの擬似コードの例があります:

@interface parent
@property (strong, nonatomic) abstractChild*  action;
- (abstractChild*) makeConcreteChildOfType:(Type)type;
- (void) performActionA;
- (void) performActionB;
- (void) performActionC;

...
- (void) performActionA;
{
    self.action = [self makeConcreteChildOfType:A];
    [self.action doYourThing];
}

- (void) performActionB;
{
    self.action = [self makeConcreteChildOfType:B];
    [self.action doYourThing];
}

私は非常に多くの異なるタイプのアクションを持っており、各子アクション クラスは何をしなければならないか、いつそれを終了するかを知っています。1 つの抽象プロパティを持つ代わりに、さまざまなタイプの具体的なアクションごとに個別のプロパティを作成し、各子オブジェクトがデリゲートを介して終了したときに親に通知するようにすることもできますが、特に複数のアクションの場合は少し面倒です。同じ型が同時にアクティブになる可能性があります (各型のオブジェクトへのポインターの配列が必要になります)。したがって、子オブジェクトが自分自身、特に自分の破壊を管理できるかどうか/どのように管理できるか疑問に思っています。

各オブジェクトが次のように見える場合:

@implementation ChildObjectA

-(void) doYourThing
{
   [self retain];
   do something
}

- (void) OnCompletion
{
    [self release];
}

それでは、これは安全ですか?-親クラスは同じタイプの複数のオブジェクトを作成できますか?それらはそれぞれが必要な限り存続し、完了すると効果的に削除され、並行して存在し、問題なく完了すると自分自身を削除できますか?

親クラスのactionプロパティはおそらく必要ないのですが、もし残っていればメモリ管理に問題がないか確認したいのですが?self.action が ARC に割り当てられるたびに、関連する子オブジェクトが解放されるとは思いませんが、子オブジェクトが解放されるまで削除されませんか?

4

2 に答える 2

0

オブジェクトがそれ自体を所有することは確かに可能ですが、それが本当に必要な場合はほとんどありません。これはその一つではないと思います。

あなたが「厄介すぎる」と呼んだ解決策は、実際には最良の解決策だと思います。また、私の考えでは、非常にシンプルでクリーンです。ファクトリは、アクション オブジェクトのコレクションを保持します。* アクション オブジェクトが完了すると、ファクトリに通知され、クリーンアップされます。これは、のアクティビティに似ていNSOperationQueueます -- キューが操作の所有権を取得します。

@implementation Factory
{
    NSMutableArray * listOfAllActions;
}

- (void) performActionA;
{
    Action * newAction = [self makeConcreteChildOfType:A];
    [listOfAllActions addObject:newAction];
    [newAction setOwner:self];
    [newAction doYourThing];
}

// And similarly for other "performAction..." methods

次に、各アクションは単純な「すべて完了しました!」を送信します。完了時の所有者へのメッセージ:

@interface AbstractChild

@property (weak) Factory * owner;

//...

@implementation AbstractChild

@synthesize owner;

- (void)cleanupAfterCompletion
{
    // Subclasses can override this to do more cleanup

    // Message the action's owner, passing self so it knows which action
    [[self owner] actionHasCompleted:self];
}

その後、工場に戻り、

- (void)actionHasCompleted: (AbstractAction *)action
{
    // Other cleanup if necessary

    // Delete action
    [listOfAllActions removeObjectIdenticalTo:action];
}

なんらかの理由でアクションがファクトリへの直接のポインタを持っているのを嫌う場合はnotificationsを使用できますが、それらは通常、2 つのオブジェクトがこれよりもはるかに弱い関係にある場合に使用されます。


*これが実際の状況です。複数のオブジェクトを作成しています。実際、率直に言って、潜在的に複数のオブジェクトに対して 1 つのプロパティを持つというあなたの考えは、私には面倒に思えます。

于 2012-07-25T19:22:32.727 に答える
0

これは、あなたがやろうとしていることの解決策になるかもしれない記事です...基本的に、参照がゼロの場合にオブジェクトを自動的にnilに設定する弱い修飾子を使用することを言っています... http://thinkvitamin.com/ code/ios/ios-5-automatic-reference-counting-arc/ (クレジットはこの記事の著者に帰属します)

于 2012-07-25T16:10:43.223 に答える