小编jmi*_*deo的帖子

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

我是一位经验丰富的开发人员,是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++规则的应用.

cocoa-touch objective-c ios automatic-ref-counting

3
推荐指数
2
解决办法
1064
查看次数