为啥 NSObject 必须在其 .class-property 可读之前进行初始化

Posted

技术标签:

【中文标题】为啥 NSObject 必须在其 .class-property 可读之前进行初始化【英文标题】:Why does an NSObject have to be initialized before its' .class-property is readable为什么 NSObject 必须在其 .class-property 可读之前进行初始化 【发布时间】:2016-08-21 06:59:14 【问题描述】:

如果我说例如:

UIImageView *imageView;
imageView = [[UIImageView alloc] init];
NSLog(@"%@", imageView.class);

它将按预期记录UIImageView


现在,如果我改用 UIImageView 的 .class 属性来分配对象(在第 0 行声明/定义为 UIImageView)的方式编写代码,它将记录 (null)

UIImageView *myImageView;
myImageView = [[myImageView.class alloc] init];
NSLog(@"%@", myImageView.class);//logs (null)

即使我在读取它的 .class 值时将对象硬转换为 UIImageView,当我稍后去记录所述类值时,我仍然会得到 (null)

UIImageView *myImageView;
myImageView = [[((UIImageView *)myImageView).class alloc] init];
NSLog(@"%@", myImageView.class);//logs (null)

【问题讨论】:

[[myImageView.class alloc] init][[nil alloc] init] 相同,它什么都不做。 是的,我明白了。我的问题真的是,为什么它是nil,即使我已经将它转换为UIImageView * 【参考方案1】:

因为你还没有初始化你myImageView,你.class返回nil给你。

UIImageView *myImageView;
myImageView = [[myImageView.class alloc] init]; // didn't initialize myImageView
NSLog(@"%@", myImageView.class);//logs (null)

所以如果你想做类似的事情:

myImageView = [[NSClassFromString(@"UIImage") alloc] init];

NSLog(@"%@", myImageView.class);//logs (UIImage)

【讨论】:

谢谢,这是为我正在尝试做的事情(涉及 CLANG 快捷方式)设置类的好方法 我不知道NSClassFromString

以上是关于为啥 NSObject 必须在其 .class-property 可读之前进行初始化的主要内容,如果未能解决你的问题,请参考以下文章

union all这样写为啥提示“使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有

为啥我在 Alamofire 中收到“字符串不是 NSObject”错误?

为啥我们不能在不从 NSObject 继承类的情况下迅速采用协议?

条件绑定的初始化程序必须具有可选类型,而不是 '[NSObject: AnyObject]' SwiftyJSON [重复]

我的 swift 函数的返回类型必须继承自 NSObject

NSArray 中的 NSObject 的属性是不是会发生变化,或者是不是必须再次将它们添加到 NSArray?