对象可以管理自己的破坏(使用ARC)吗?

时间:2012-07-25 15:27:49

标签: objective-c

我有一个需要执行多个操作的控制父类,这些操作通常具有非常短的生命周期。我正在使用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];
}

我有很多不同类型的操作,每个子操作类都知道它必须做什么以及何时完成它。 我可以为每个不同类型的具体动作创建单独的属性,而不是具有一个抽象属性,并且每个子对象在通过委托完成时通知父节点,但是这开始变得有点混乱,尤其是当多个动作的事实时同一类型可能同时处于活动状态(这需要指向每种类型对象的指针数组)。因此,我想知道子对象是否/如何管理自己,特别是他们自己的破坏。

如果每个对象看起来像这样:

@implementation ChildObjectA

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

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

那么这样做安全吗? - 父类可以创建多个相同类型的对象,只要每个对象都需要,它们都可以生存,并且在完成时有效地删除它们并且它们可以并行存在并在完成时自行删除而不会出现问题吗?

可能不需要父类的action属性,但如果保留了那么我想确认内存管理没有出现问题?我认为不是每次将self.action分配给ARC都会释放相关的子对象,但是在子对象释放之前它不会被删除吗?

2 个答案:

答案 0 :(得分:0)

这篇文章可能是你要做的事情的解决方案......它基本上是说使用弱限定符,如果它的引用为零,则自动将对象设置为nil ... http://thinkvitamin.com/code/ios/ios-5-automatic-reference-counting-arc/(归功于本文作者)

答案 1 :(得分: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,但这些通常适用于两个物体的关系比这更弱的时候。


*这就是现实 - 您正在创建多个对象。事实上,坦率地说,你想要为潜在的多个对象设置一个属性对于 me 而言似乎很混乱。