两个iPhone内存管理问题

两个iPhone内存管理问题,iphone,memory,memory-leaks,memory-management,Iphone,Memory,Memory Leaks,Memory Management,我有两个问题 1) 以下哪项将释放ob - (void){ ClassOne *ob = [[ClassOne alloc] init]; // should I use autorelease here? self.O = ob; [ob release]; // is this correct ?? } 或 2) 有两个类,ClassOne和ClassTwo。ClassTwo中的一种方法是: - (void) takeParam:(ClassOne *pt) { // s

我有两个问题

1) 以下哪项将释放ob

- (void){
  ClassOne *ob = [[ClassOne alloc] init]; // should I use autorelease here?
  self.O = ob;
   [ob release]; // is this correct ??
}

2) 有两个类,
ClassOne
ClassTwo
ClassTwo
中的一种方法是:

- (void) takeParam:(ClassOne *pt) {
  // something going here
}
第三个类中有一个方法

- (void) runIt {
   ClassOne *ob = [[ClassOne alloc] init];
   [classTwoOb takeParam:ob];
}

对于
ClassOne
对象,我应该在哪里调用release?

方法
-release
只会减少所讨论对象的保留计数。当保留计数达到零时,运行时将调用
-dealloc

- (void) runIt {
   ClassOne *ob = [[ClassOne alloc] init];
   [classTwoOb takeParam:ob];
}
如果您在任何时候发送
alloc
copy
retain
消息,您必须稍后调用
release
autorelease


有关更多详细信息,请参见。

使用
-release
方法只会减少相关对象的保留计数。当保留计数达到零时,运行时将调用
-dealloc

- (void) runIt {
   ClassOne *ob = [[ClassOne alloc] init];
   [classTwoOb takeParam:ob];
}
如果您在任何时候发送
alloc
copy
retain
消息,您必须稍后调用
release
autorelease


有关更多详细信息,请参阅。

数字1可能是正确的

ClassOne *ob = [[ClassOne alloc] init]; // do i should use autorelease here ?
当您调用
[ClassOne alloc]
时,您会得到一个retain计数为1的对象,并负责释放

self.O = ob;
假设
self.O
retain
属性而不是
assign
属性,
self.O
/
ob
的retain计数为2

[ob release];
现在,
self.O
/
ob
的保留计数为1。此
版本
alloc
匹配。剩余的保留计数归
self
所有,因此当
self
完成时,您必须记住释放
O

-(void)dealloc{
    [O release]; // is this correct ??
}
好。您记得要释放
O
。现在,当解除分配
self
时,
O
将完全释放。(注意:您应该在
dealloc
末尾调用
[super dealloc]

您应该在调用
takeParam:
后释放
ob
。方法负责保留它们想要保留的对象。如果
takeParam:
ob
存储在
classTwoOb
上,则应在方法返回之前将其保留。如果不是,就不应该

在返回已创建对象的方法中使用
autorelease
。这使调用者有机会保留对象,如果它想要它,或者不需要它很长时间。例外情况是用于创建对象的方法,这些方法应始终被称为
alloc
new
*copy*
,并应返回引用计数为1的对象,使调用方负责发布

self.O = ob;

要真正了解Objective-C内存管理,我建议您阅读《内存管理编程指南》,尤其是第1部分可能是正确的

ClassOne *ob = [[ClassOne alloc] init]; // do i should use autorelease here ?
当您调用
[ClassOne alloc]
时,您会得到一个retain计数为1的对象,并负责释放

self.O = ob;
假设
self.O
retain
属性而不是
assign
属性,
self.O
/
ob
的retain计数为2

[ob release];
现在,
self.O
/
ob
的保留计数为1。此
版本
alloc
匹配。剩余的保留计数归
self
所有,因此当
self
完成时,您必须记住释放
O

-(void)dealloc{
    [O release]; // is this correct ??
}
好。您记得要释放
O
。现在,当解除分配
self
时,
O
将完全释放。(注意:您应该在
dealloc
末尾调用
[super dealloc]

您应该在调用
takeParam:
后释放
ob
。方法负责保留它们想要保留的对象。如果
takeParam:
ob
存储在
classTwoOb
上,则应在方法返回之前将其保留。如果不是,就不应该

在返回已创建对象的方法中使用
autorelease
。这使调用者有机会保留对象,如果它想要它,或者不需要它很长时间。例外情况是用于创建对象的方法,这些方法应始终被称为
alloc
new
*copy*
,并应返回引用计数为1的对象,使调用方负责发布

self.O = ob;
要真正学习Objective-C内存管理,我建议您阅读《内存管理编程指南》,特别是关于