Objective c 对象释放过程中的问题

Objective c 对象释放过程中的问题,objective-c,object,release-management,Objective C,Object,Release Management,我有一些问题,在什么时候和哪个对象被释放 你可以说我对这方面的了解较少 我有以下情况,请建议我相应的答案 情景1 NSMutableString*str=[[NSMutableString alloc]initWithFormat:@“Hello World!”] NSMUTABLEARRY*array=[[NSMUTABLEARRY alloc]init] [数组addObject:str] 现在,当我试图释放str时,数组的使用将在将来受到影响……反之亦然 告诉我我可以释放这两个吗 情

我有一些问题,在什么时候和哪个对象被释放

你可以说我对这方面的了解较少

我有以下情况,请建议我相应的答案

  • 情景1
NSMutableString*str=[[NSMutableString alloc]initWithFormat:@“Hello World!”]
NSMUTABLEARRY*array=[[NSMUTABLEARRY alloc]init]
[数组addObject:str]

现在,当我试图释放str时,数组的使用将在将来受到影响……反之亦然
告诉我我可以释放这两个吗

  • 情景2
NSMutableString*str=[[NSMutableString alloc]init]; str=@“你好,世界!”
str=[self-getData]//调用返回字符串的方法
[str释放]

我想我在这里造成了内存泄漏(如何解决?)


请清除这些情况

在第一种情况下,您需要调用
[str release]将其添加到数组后,如下所示:

NSMutableString *str = [[NSMutableString alloc] initWithString:@"Hello World!"];
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:str];
[str release];
这样,
array
保存对字符串的唯一retain调用。稍后释放
array
后,将不会出现任何内存泄漏问题

我对第二种情况有点困惑
str
这是一个指针。您似乎将三个不同的对象指定给同一个指针:

NSMutableString *str = [[NSMutableString alloc] init]; //first object
str=@"Hello World !"; //second object
str=[self getData]; //third object
当您调用
[str release]
时,您已经创建了一个内存泄漏,因为您丢失了第一个可变字符串。第二次调用
str=
,您失去了访问第一个
NSMutableString
的任何方法

假设您希望连接所有这些(因为您选择了NSMutableString),您可以尝试以下方法:

NSMutableString *str = [[NSMutableString alloc] init]; //first object
[str appendString:@"Hello World!"];
[str appendString:[self getData]];
[str release];

如果
[self-getData]
方法返回一个自动删除的字符串,您就可以了。如果
getData
返回保留的字符串(如果使用了
alloc
init
),您需要将其分配给中间指针,并在将其添加到
str

后释放它。创建NSMutableString的需要是什么?您可以直接使用NSString实现此目的

您的意思是我的第二个案例没有问题(如果我返回自动释放字符串)?不,您的第二个案例仍然有问题,因为您要额外分配两次
str
。当你使用
str=@HelloWorld!“
,您初始化的第一个对象将丢失。我的答案将您的分配更改为调用
appendString
+1---我已经了解到,如果我们有两个字符串(都已初始化),并且如果我使用Str1=Str2,那么您只需释放其中一个字符串?(如果错误,请纠正我)如果我们谈论IBoutlets..我应该释放它们吗?您可能需要读取指针。这是正确的,但那是因为Str1不是实际的字符串,它是指向字符串的指针。如果使用Str1=Str2,这意味着您有两个指向同一字符串的指针,因此只调用release一次。在您的示例中,两个字符串有一个指针,so其中一根弦丢失。