iOS的objective-c/cocoa中存在哪些方法族?

jmi*_*deo 3 cocoa-touch objective-c ios automatic-ref-counting

我是一位经验丰富的开发人员,是iOS开发的新手(特别是在iPhone上).我正在研究的项目是使用自动参考计数(ARC).

我正在对ARC进行一些研究,并且遇到了这个文档:http://clang.llvm.org/docs/AutomaticReferenceCounting.html以及标题为"保留返回值"的部分,它声明可以使用属性来指示呼叫者希望获得+1保留计数的所有权.它还继续声明ARC会自动将属性添加到方法中,如果它检测到特定方法系列(具体名称:alloc,copy,init,mutableCopy和new)

从进一步阅读看来,方法族似乎只是方法命名约定.我的理解是,如果方法名称以方法族开头,那么它就在该方法族中.所以举个例子

+(id) init
+(id) initWithName:(NSString*)name
Run Code Online (Sandbox Code Playgroud)

都是init方法系列的一部分.

我的问题是:是否有正式的iOS开发定义方法系列列表,如果是这样,它们/我在哪里可以找到它?

下面是我上面提到的llvm.org部分:

第3.2.2节:保留的返回值表示:

返回可保留对象指针类型的函数或方法可以被标记为返回保留值,表示调用者期望获得+1保留计数的所有权.这是通过将ns_returns_retained属性添加到函数或方法声明来完成的,如下所示:

id foo(void)__ attribute((ns_returns_retained)); - (id)foo __attribute((ns_returns_retained)); 此属性是函数或方法类型的一部分.

从这样的函数或方法返回时,ARC在离开所有本地范围之前,在return语句的评估点保留该值.

当从这样的函数或方法接收返回结果时,ARC会在其包含的完整表达式的末尾释放该值,这取决于对本地值的通常优化.

理由:这将所有权从被叫方直接转移给来电者.此模型最常见的情况是init,alloc,new和copy方法的保留返回,但框架中还有其他情况.优化后,通常不需要额外的保留和释放.

alloc,copy,init,mutableCopy和new系列中的方法是隐式标记的属性((ns_returns_retained)).这可以通过显式标记方法属性((ns_returns_not_retained))来抑制 .

如果Objective-C消息静态解析的方法对其动态解析的方法的结果具有不同的保留语义,则它是未定义的行为.如果通过静态类型进行块或函数调用,则它是未定义的行为,该类型的调用块或函数的实现结果具有不同的保留语义.

理由:返回结果不匹配将导致过度保留或过度释放,具体取决于方向.同样,关于函数调用的规则实际上只是关于通过不兼容的函数类型调用函数的现有C/C++规则的应用.

BJ *_*mer 9

同一文件的第5部分标题为"Method Families".它列出了所有当前定义的系列,这些系列是您在上面确定的系列; alloc,new,copy,mutableCopy,和init.它还列出了成为该家庭一部分的标准.大多数情况下,它只是基于方法名称,但它也取决于返回类型.例如,一个copy家庭成员必须返回一个对象; 具有void返回类型的复制方法不会被视为copy方法系列的一部分.


And*_*sen 5

我不知道我已经看到了一个正式的方法族列表,但你的分析基本上是正确的.我相信具有编译器强制语义的唯一方法命名约定是您在帖子中提到的那些,即alloc,init,copy(和mutableCopy)和new.甚至在ARC之前/之后,Xcode中包含的clang静态分析器使用这些命名约定来查找内存管理问题,它们也是ARC之前Objective-C程序员长期存储器管理规则的基础.

也就是说,如果使用以init,copy,mutableCopy或new开头的方法创建对象,则"拥有"该对象并负责稍后释放它.由具有任何其他名称的方法创建或返回的对象归您,调用者所有,如果要保留对它们的引用,则必须保留它们.当您完成对象引用时,您的每个保留必须由更高版本进行平衡.最后,在对象上调用autorelease将其放在最里面的自动释放池中.池负责稍后释放对象,稍后在当前作用域之后的某个时间.因此,释放和自动释放都是放弃对象保留的有效方法.

现在,我所提出的规则不应该(并且不能)由您(程序员)在ARC下遵循.但是,ARC本质上是一个系统,在这个系统中,编译器在静态分析器的帮助下知道这些规则并在编译时为您插入必要的内存管理调用.因此,如果您希望了解ARC在幕后做什么,理解这些规则是一个良好的开端.

这看起来有点长,但关键是你命名的方法是我所知道的唯一在Objective-C中具有强制命名约定的方法,它源于上面提出的内存管理规则.Objective-C中还有其他命名约定,但它们是标准的样式约定,而不是任何地方强制执行的约定.