在启用ARC的项目中使用alloc,init

时间:2012-11-21 14:31:47

标签: objective-c ios automatic-ref-counting init alloc

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

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

然后我需要自己release myString如果我使用ARC,该怎么办?我无法释放自己。它会造成泄漏吗?或者我应该不创建这样的对象?

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

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

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

3 个答案:

答案 0 :(得分:14)

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

之间的区别
NSString *myString = [[NSString alloc]initWithFormat:@"Something"];

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

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

答案 1 :(得分:1)

ARC负责内存管理,因此您不必担心在release变量上调用myString,ARC会为您执行此操作。另外作为建议,我建议使用便捷方法来创建对象,例如

[NSString stringWithFormat:@"Something"];

答案 2 :(得分: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 =中的代码@“你好”,所以如果你在自动释放区内你没有任何问题,str2将被正确打印。
这就是我使用initWithUTF8String来避免编译器优化的原因。

相关问题