在iOS上过渡到ARC。
我有一个自动释放的NSString,用于生成UTF-8表示,并依赖池生命周期来保持UTF-8指针活着:
char *GetStringBuffer(something)
{
NSString *ns = [NSString stringWithSomething:something];
return [ns UTF8String];
}
something
的性质在这里并不重要。
预ARC规则确保返回的数据指针在当前自动释放池的生命周期内保持有效。至关重要的是,我没有携带NSString指针。
现在,在ARC下,函数返回时不会释放字符串吗?我不认为ARC会认为char *
深入NSString内部的结构是一个强大的参考,特别是看到它没有被明确释放过。
这里最好的ARC成语是什么?
答案 0 :(得分:3)
如果要保证UTF8String
的返回值在当前自动释放池耗尽之前有效,则有两种选择:
在compiled with ARC disabled的文件中定义GetStringBuffer
。如果stringWithSomething:
遵循约定,则必须将自动释放的NSString
返回给非ARC调用者。如果不是(例如它的行为类似于-[NSArray objectAtIndex:]
),则可以明确retain
和autorelease
。
使用免费桥接和CFAutorelease
:
char *GetStringBuffer(something) {
NSString *ns = [NSString stringWithSomething:something];
CFAutorelease(CFBridgingRetain(ns));
return [ns UTF8String];
}
答案 1 :(得分:0)
(我不能删除它,因为它已被接受,但这个答案是不正确的。请参阅Rob Mayoff的回答,以及对该答案的评论以获得解释。没有承诺此指针在返回后有效语句。)强>
重写我的整个答案。不得不挖掘和挖掘,但我相信今天这是惊人的安全(由于我的崩溃导致ARC的改进;我知道这样的东西在我的脑后滚动)。原因如下:
@property (readonly) __strong const char *UTF8String NS_RETURNS_INNER_POINTER; // Convenience to return null-terminated UTF8 representation
UTF8String
标记为NS_RETURNS_INNER_POINTER
,实际上是objc_returns_inner_pointer
。调用该方法:
对象的生命周期将延长至至少最早:
- 在调用函数或
中最后一次使用返回的指针或从中派生的任何指针- 自动释放池将恢复到之前的状态。
这就是你想要它做的事。