使用Class指针有多安全?

时间:2014-11-19 15:29:58

标签: objective-c class cocoa

使用Objective-C的Class有多安全?

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

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

}

- >类指针可以改变吗?

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

2 个答案:

答案 0 :(得分:4)

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

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

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

类对象永远不会被释放 - 你可以依赖它们活着(即而不保留它们),直到进程完全终止。

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

  • 加载包可以向运行时添加类,例如导致NSClassFromString开始为他们的名字返回非零。
  • 如果动态加载bundle导致类名冲突,则运行时当前会记录投诉但仍在继续工作;没有具体说明在这种情况下究竟发生了什么。
  • 从Mac OS X 10.5开始,可以卸载捆绑包,从而导致删除其类。如果保留了其中一些类,则未指定应该发生什么。

答案 1 :(得分:2)

当然[User class]可以是Nil + classNSObject类中定义的静态方法,因此这意味着每个人都可以覆盖+ class并返回任何值。

以下是[User class]如何返回Nil

的示例
@implementation User

+ (Class)class
{
    return Nil;
}

@end

同样[User class]可以返回任何值,并且可以更改指针

@implementation User

+ (Class)class
{
    switch (arc4random() % 3) {
        case 0:
            return [UIButton class];
            break;
        case 1:
            return [UILabel class];
            break;
        case 2:
            return [NSString class];
            break;
        default:
            break;
    }
    return Nil;
}

@end

Apple提供的课程将始终按预期工作(如@hamstergene建议)但是,如果他们的+class方法没有被程序员调整。

所以使用[User class]并不是一种安全的方法 而不是那样,使用运行时函数直接从运行时获取类

#import <objc/runtime.h>

info[@"class"] = objc_getClass("User")