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];
}

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

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

@implementation ChildObjectA

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

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

那么这样做安全吗?- 父类是否可以创建多个相同类型的对象,并且只要每个对象都需要并且在完成时有效地删除自己并且它们可以并行存在并在没有问题的情况下删除自己,它们都可以存活吗?

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

4

2 回答 2

0

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

于 2012-07-25T16:10:43.223 回答
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];
}

如果由于某种原因您不喜欢直接指向工厂的操作,您可以使用通知,但这些通常是两个对象之间的关系比这弱得多的时候。


*这就是现实情况——您正在创建多个对象。事实上,坦率地说,你对可能多个对象拥有一个属性的想法对我来说似乎很混乱。

于 2012-07-25T19:22:32.727 回答