我对以下短语中的“否则”和“只要”用法感到困惑;
否则,ARC不会强制执行Objective-C类型系统 实现方法遵循静态类型的签名。 如果ARC暴露于无效指针,则为未定义的行为。
出于ARC的目的,一个有效的对象就是“表现良好”的对象 保留业务。具体而言,必须对象进行布局 Objective-C消息发送机器可以成功发送它 以下消息:
- 保留,不带参数并返回指向对象的指针。
- 发布,不带任何参数并返回void。
- autorelease,不带参数并返回指向对象的指针。
http://clang.llvm.org/docs/AutomaticReferenceCounting.html
我们可以推断出以下内容;
...(忘记其他情况)......如果实施方法遵循静态类型的签名,ARC将强制执行Objective-C类型系统。
是否在讨论保留,释放,自动释放方法的签名?如果是这样,它是否具有负面含义;
如果实施方法遵循静态类型的签名,ARC将_ 不 _强制执行Objective-C类型系统。
答案 0 :(得分:1)
全文如下:
可保留对象指针是空指针或指向有效对象的指针。此外,如果它具有块指针类型并且不为null,则它实际上必须是指向块对象的指针,并且如果它具有类类型(可能是协议限定的),那么它实际上必须是指向类对象的指针。否则,只要实现方法遵循静态类型的签名,ARC就不会强制实施Objective-C类型系统。如果ARC暴露于无效指针,则为未定义的行为。
英语语法有点复杂,但它说如果指针没有被声明为Class,那么ARC不会对它做任何事情。
答案 1 :(得分:1)
这是一个带有“块指针类型”的“可保留对象指针”变量:
void (^blockPointerTypeVariable)(int);
如果将blockPointerTypeVariable
设置为指向不块的内容,则程序的行为是未定义的。 (您可以将其设置为指向具有不同类型签名的块,而不违反ARC的要求。但您无法将其设置为指向UIView
。)
这是一个带有“Class
类型”的“可保留对象指针”变量:
Class someClass;
这是一个“可保留的对象指针”变量,其中“Class
类型”是“协议限定的”:
Class<SomeProtocol> someClassWithProtocol;
如果您将someClass
或someClassWithProtocol
设置为指向不是Class
的内容,则程序的行为是未定义的。 (因此,您可以将其设置为[self class]
或[UIView class]
,但不能将其设置为指向UIView
的实例。)
这是一个“可保留的对象指针”变量,它不是特殊情况之一:
UIView *view;
就ARC而言,您可以将此指针设置为指向任何,只要任何内容与UIView
对retain
具有相同类型的签名即可,release
和autorelease
。如果您将view
指向retain
的类型签名与-[UIView retain]
的签名不同的内容,则表明您的程序行为未定义。
您可以将view
变量设置为指向任何内容,只要任何内容适用于Objective-C消息发送系统(意味着objc_msgSend
函数及其变体),并且因为任何东西在收到retain
,release
和autorelease
消息时都有所描述的语义。
特别是,这意味着你可以将它指向不是Objective-C类实例的东西,如果你小心地使这些东西的内存布局与objc_msgSend
期望的内容匹配,并且当您对retain
,release
和autorelease
做出正确回应时。 Apple使用Core Foundation类型进行此操作(虽然它没有完全记录)。