使用Class指针有多安全?

Pet*_*isu 5 cocoa class objective-c

Objective-C使用Class有多安全?

- >我可以将Class safe存储在字典中而不是比较

info[@"class"] = [User class];
...
if ([User class] == info[@"class"]) {

}
Run Code Online (Sandbox Code Playgroud)

- >类指针可以改变吗?

- >它是否被隔离为永远Nil

ham*_*ene 4

类对象的行为与普通对象类似。它们可以被保留、释放、作为参数和返回值传递、存储在 ivars 和属性中、存储在容器 \xe2\x80\x94 中,基本上是任何东西。

\n\n

[SomeClassName class]如果找不到此类,通常不会编译或链接,但它有可能编译但返回 nil,例如,在没有该类可用的操作系统上运行时,即比您的开发版本更旧的操作系统版本SDK。如果此类不存在,则NSClassFromString返回值为。nil

\n\n

类对象的指针值(标识)永远不会改变。每个类名只有一个类对象,可以使用C==运算符来测试类指针是否是同一个类。+ isSubclassOfClass:(子类/超类关系可以使用类方法来测试)。

\n\n

类对象永远不会被释放 \xe2\x80\x94 您可以依赖它们保持活动状态(即不保留它们),直到进程完全终止。

\n\n

上述情况适用于大多数应用;然而,捆绑加载有一个棘手的情况(捆绑卸载的情况甚至更棘手):

\n\n
    \n
  • 加载包可能会向运行时添加类,例如导致NSClassFromString它们的名称开始返回非零。
  • \n
  • 如果动态加载包导致类名冲突,运行时当前会记录一个投诉,但会继续工作;没有具体说明在这种情况下到底会发生什么。
  • \n
  • 从 Mac OS X 10.5 开始,可以卸载捆绑包,从而导致其类被删除。没有指定如果保留其中一些类会发生什么。
  • \n
\n

  • “像 [SomeClassName class] 这样的表达式总是非零”不正确。如果 `SomeClassName` 是仅在较新的操作系统版本上可用的类,这是您应用程序的基础 SDK,并且您的部署目标是较旧的操作系统版本,它将编译和链接,但在旧操作系统版本上运行时,`[SomeClassName class]` 将是 `nil`。 (2认同)