实际上我正在开发一个启用了ARC
的项目。我知道使用alloc
和init
正在使用对象的ownership
。我知道,如果我创建一个像这样的字符串
NSString *myString = [[NSString alloc]initWithFormat:@"Something"];
然后我需要自己release
myString
。 如果我使用ARC,该怎么办?我无法释放自己。它会造成泄漏吗?或者我应该不创建这样的对象?
我也可以像下面的代码一样创建一个字符串。
NSString *myString = [NSString stringWithFormat:@"Something"];
但是我需要使用哪种类型的ARC启用项目?如果我使用第一种类型会发生什么?
答案 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来避免编译器优化的原因。