使用Objective-C的Class有多安全?
- >我可以将Class safe存储在字典中而不是比较
info[@"class"] = [User class];
...
if ([User class] == info[@"class"]) {
}
- >类指针可以改变吗?
- >它是否被隔离为永不Nil
?
答案 0 :(得分:4)
类对象的行为与普通对象相同。它们可以保留,释放,作为参数和返回值传递,存储在ivars和属性中,存储在容器中 - 基本上,任何东西。
[SomeClassName class]
通常不会编译或链接,如果找不到这样的类,但它可以编译但返回nil,例如,当在没有该类可用的OS上运行时,即较旧的操作系统版本而不是您的开发SDK版本。如果此类不存在,NSClassFromString
的返回值将为nil
。
类对象的指针值(标识)永远不会改变。每个类名只有一个类对象,您可以使用C ==
运算符来测试类指针是否是同一个类。 (可以使用+ isSubclassOfClass:
类方法测试子类/超类关系。)
类对象永远不会被释放 - 你可以依赖它们活着(即而不保留它们),直到进程完全终止。
以上情况适用于大多数应用;然而,有一个棘手的捆绑加载案例(甚至更麻烦的捆绑卸载案例):
NSClassFromString
开始为他们的名字返回非零。答案 1 :(得分:2)
当然[User class]
可以是Nil
+ class
是NSObject
类中定义的静态方法,因此这意味着每个人都可以覆盖+ 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")