2010-12-02 35 views
0

我有一个控制器类X有IBAction实例方法说dosomething。分配和释放一个类

我有其他类Y做了一些计算,并委托自己。

在这个方法中,可以创建一个类Y的实例。现在应该在哪里发布Y的实例。@property是唯一的解决方案。

//这个动作在类X

- (IBAction为)DoSomething的:(ID)发送方 {

Y * Y = [[Y的alloc] INIT];

// init方法在Y中实现,执行一些工作以及它的代表时常被调用。如果我们释放y,则为 。这将是一场崩溃。那么发布y的地方在哪里。 @property是创建一次性内存并使用它的解决方案。 有没有什么办法可以在这里发布,只有当下一次创建其他对象的时候,只有当代表完成一段时间后他们的工作才会被销毁//

// [y release];它的崩溃。

}

+1

你好。只有几个语义问题:一个类只被分配一次,并且它永远不会“释放”或以其他方式解除分配,直到Objective-C运行时被取出内存AFAIK。所以,你真正想知道的是**对象的分配和释放**,而不是**类**。在其他语言中(尤其是那些将类建模为原型的语言),这种区别并不重要,但在Objective-C中,它非常重要:类也是一个对象,它管理着对象的特征。 – 2010-12-02 15:43:08

+0

嗨乔纳森谢谢。我几乎没有怀疑是不是必须的如果类创建了这样一种方式它有它的对象,并且类说Y本身是其他类的对象,现在有必要释放类Y.当多个对象在X中被创建和销毁。 – ashish 2010-12-03 09:24:22

回答

0

你可以做一两件事,

// In the .h file 
// declare like this. 
Y *y; 

// In the .m file 

-(IBAction)dosomething:(id)sender { 

    if(y== nil) 
     y = [[Y alloc]init]; 

} 

,并在dealloc方法,可以释放

- (void)dealloc{ 
    [y release]; 
    [super dealloc]; 
} 
+0

如果有几次这个方法被调用 - (IBAction)dosomething:(id)发送者一次。那么在那个时候y不会是零,所以并不是因为那种方法上的少量命中而没有同时创建新的实例。 – ashish 2010-12-02 12:27:18

0

它似乎对我来说,最简单的方法来解决问题是在Y dealloc中调用Y.delegate = nil,并在调用任何Y.delegate方法之前检查Y.delegate == nil

0

你说一些工作是在Y类的init方法中完成的。在某些代表需要Y的对象直到工作完成之前。之后,你想释放Y.

因此,在该代表中有一个Y属性并使其保留。释放它,并在你的工作完成后将它设置为零。

所以在X的dosomething()方法中,您可以立即释放Y的实例。 请记住这条规则,当X需要Y直到它的工作完成时才活着,它只需要拥有所有权。

这正是为什么保留计数在Obj C中维护的原因。这样一个对象可以拥有多个所有者。当它的所有者释放对象时,只有它从内存中移除。