【问题标题】:Why alloc return nil? ( Objective-C )为什么alloc返回nil? (目标-C)
【发布时间】:2021-05-05 17:06:55
【问题描述】:

我正在将 iOS opengl 游戏移植到 metal

使用金属角度 https://github.com/kakashidinho/metalangle

我使用预编译的动态库

创建 MGLContext 时返回 nil

MGLContext * aaa = [MGLContext alloc];

aaa == nil

这是为什么呢?

我以为alloc只有在内存溢出时才会返回nil

【问题讨论】:

  • 在设备和模拟器上都是 nil 吗?
  • 什么返回[MGLContext class]

标签: objective-c null dynamic-library alloc


【解决方案1】:

这是由“弱链接”引起的问题

感谢@RobNapier

谢谢大家

image1

image2

【讨论】:

    【解决方案2】:

    在现代 ObjC 中,it is not well-defined 只调用 +alloc 而不调用 init 方法:

    您必须使用 init... 方法来完成初始化过程。例如:

    TheClass *newObject = [[TheClass alloc] init];
    

    这从来都不是一个好的做法,但您现在不能分开分配和初始化。

    也就是说,你是如何测试这个的?到目前为止,我还无法重现它。 MGLContext 本身可能是nil。如果动态库是 weakly linked 并且不存在,就会发生这种情况。

    【讨论】:

    • 同意,我简化了问题原来的代码是 MGLContext * context = [[MGLContext alloc] init];我用 NSString 替换了 MGLContext,aaa 不是 nil NSString* aaa= [NSString alloc]; aaa != 无
    • init 不是MGLContext 的指定初始化程序,也不是便利初始化程序。它根据源代码需要initWithAPI:。 (不过,我仍然怀疑 MGLContext 是 nil,因为链接很弱)
    • @opencai 所以如果原始代码是[[MGLContext alloc] init],那么nil 更有可能由init 返回,因为它是错误的初始化程序。
    • 初始化错误不会返回nil。它只是不会正确设置对象(查看代码,看看它实际做了什么)。 nil 表明该类不可用。
    • @RobNapier 可能有代码:- (instancetype) init { [super init]; return nil; }?
    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多