7

实际上我正在开发一个ARC启用的项目。我知道使用allocinit正在使用ownership该对象。我知道,如果我创建这样的字符串

NSString *myString = [[NSString alloc]initWithFormat:@"Something"];

然后我需要releasemyString自己。如果我使用启用 ARC 怎么办?我无法释放自己。那么它会造成泄漏吗?还是我不应该创建这样的对象?

我也可以像下面的代码一样创建一个字符串。

NSString *myString = [NSString stringWithFormat:@"Something"];

但是对于启用 ARC 的项目,我需要使用哪种类型?如果我使用第一种类型会发生什么?

4

3 回答 3

16

如果您使用 ARC,release编译时会为您添加所有必要的调用。它不会泄漏。

和...之间的不同

NSString *myString = [[NSString alloc]initWithFormat:@"Something"];

NSString *myString = [NSString stringWithFormat:@"Something"];

是第一个将myString在该块中最后一次引用后自动释放,而第二个是自动释放实例,只会在运行循环结束时释放。差别不大,但如果您使用大量对象,请尽量避免使用自动释放的对象以保持较低的内存使用率。

于 2012-11-21T14:35:19.527 回答
1

releaseARC 负责内存管理,因此您不必担心调用myString变量,ARC 会为您完成。另外作为一个建议,我建议使用方便的方法来创建您的对象,例如

[NSString stringWithFormat:@"Something"];

于 2012-11-21T14:34:50.090 回答
0

将字符串指针设置为 nil 即可释放它。
你也可以做没有 ARC 也能做的事情,但是如果你没有明确地做任何事情,ARC 会(几乎)为你管理一切。

所以要释放它,你将它设置为 nil,让我们看看你还能做什么:

    NSString* str= [[NSString alloc]initWithUTF8String: "Hello"];
    // here the retain count of str is 1
    __unsafe_unretained NSString* string= str;
    // again 1 because string is __unsafe_unretained
    void* data= (__bridge_retained void*) string;
    // data retains the string, so the retain count is to 2
    // This is useful in the case that you have to pass an objective-c object
    // through a void pointer.You could also say NSString* data= string;
    str=nil;
    // Here the retain count of str is 1
    NSLog(@"%@",(__bridge NSString*)data);

更新

这就是为什么有时你没有注意到一个对象被释放的原因:

    NSString* str= [[NSString alloc]initWithString: @"hey"];
    __unsafe_unretained NSString* str2=str;
    str=nil;
    NSLog(@"%@",str2);

在这种情况下str=[[NSString alloc]initWithString:@"hey"]等于str=@"hey",区别在于str是自动释放而不是释放。但是编译器优化了str=@"hello中的代码",所以如果你在一个自动释放块内,你不会有任何问题,str2 将被正确打印。
这就是我使用 initWithUTF8String 来避免编译器优化的原因。

于 2012-11-21T15:09:13.083 回答