阅读基金会的标题时,我发现了这个:
- (__strong const char *)UTF8String NS_RETURNS_INNER_POINTER;
// Convenience to return null-terminated UTF8 representation
这是来自iOS 7.1 SDK中的NSString.h
,__strong const char *
在这里是什么意思?
我最担心的是"__strong"
。
答案 0 :(得分:5)
基础在iOS和Mac OS之间共享。在Mac OS上,有一段时间存在垃圾收集内存管理系统。它已被弃用,在Mac OS上不再受支持。它从未在iOS上使用过。
GC使用__strong
作为普通指针类型声明的修饰符,使指向内存的内容可收集。 __strong
的这种用法在ARC或手动保留/释放代码中没有任何意义。声明没有警告的事实可能只是因为clang在系统标题中没有发出警告。
答案 1 :(得分:0)
NS_RETURNS_INNER_POINTER
是一个Clang注释,表示该方法返回一个指向其内部数据结构之一的指针(即实例变量),和表示内部变量未被引用计数,所以无论何时调用该方法,ARC都应该增加 receiver 的保留计数(因为只要指向其内部数据结构的指针正在使用,就不应该释放该对象。)
在这种情况下,__strong
基本上与NS_RETURNS_INNER_POINTER
一起使用,以指示返回指向其内部数据结构的指针的对象的生命周期。
答案 2 :(得分:-1)
__strong
表示持有指针的对象(在本例中为NSString类)保留其所有权直到对象的生命周期结束,并且指向的内存将被垃圾收集。因此INNER
。
const char *
表示此指针指向的char
数组是常量,即无法更改,例如通过更改其中的某些字符(您将收到编译器错误)。
如果你试图编译它:
#import <Foundation/Foundation.h>
int main(int argc, char **argv)
{
NSString *s = @"string";
const char *str = [s UTF8String];
printf("%s\n", str);
str[0] = 'S';
printf("%s\n", str);
return 0;
}
您将收到read-only variable is not assignable
错误。