将字符串指针设置为 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 来避免编译器优化的原因。