第一段
这是一个具有“块指针类型”的“可保留对象指针”变量:
void (^blockPointerTypeVariable)(int);
如果你设置blockPointerTypeVariable
指向不是块的东西,你的程序的行为是未定义的。(您可以将其设置为指向具有不同类型签名的块,而不会违反 ARC 的要求。但您不能将其设置为指向 a UIView
。)
这是一个带有“<code>Class type”的“可保留对象指针”变量:
Class someClass;
这是一个“可保留对象指针”变量,其“<code>Class type”是“协议限定的”:
Class<SomeProtocol> someClassWithProtocol;
如果你设置someClass
或someClassWithProtocol
指向不是 a 的东西,Class
你的程序的行为是未定义的。(因此您可以将其设置为[self class]
or [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 类型来做到这一点(尽管它没有完全记录在案)。