gpt4 book ai didi

objective-c - 如何在 Objective-C 中实例化指针

转载 作者:行者123 更新时间:2023-12-03 17:29:58 25 4
gpt4 key购买 nike

假设我有一个指向类型 ICScannerDevice 类的指针,我已为其分配了一些内存。现在,我想使用 ICDevice 类型的指针来初始化它,它是 ICScannerDevice 的父类。我该怎么做?

下面的方法是正确的吗?我想不是!

ICScannerDevice* scannerDevice = [[ICScannerDevice alloc] init];
scannerDevice = (ICScannerDevice*)device; // device is a pointer to ICDevice.

最佳答案

Suppose I have a pointer to type ICScannerDevice class for which I have allocated some memory.

ICScannerDevice* scannerDevice = [[ICScannerDevice alloc] init];

你在这里混淆了两件事。 变量声明创建,声明还可以包含初始化表达式

当您声明变量时,分配的空间可以包含变量类型 - 无论该类型是 int ,在这种情况下该值将是一个整数,例如42 ,或ICScannerDevice * ,在这种情况下,该值将是对分配的 ICScannerDevice 的引用对象。

所以声明:

ICScannerDevice* scannerDevice

提供存储 ICScannerDevice * 类型的值所需的所有空间。您给出的初始化表达式:

[[ICScannerDevice alloc] init];

在您的情况下是多余的(并且浪费的),您不希望创建 ICScannerDevice 类型的对象并将对该对象的引用存储在 scannerDevice 中因为您希望在变量中存储完全不同的引用:

Now, I want to initialize it with the pointer of type ICDevice which is a parent class of ICScannerDevice.

scannerDevice = (ICScannerDevice*)device; // device is a pointer to ICDevice.

这是错误的,因为你说 device包含对 ICDevice 的引用目的。作为类型ICDeviceICScannerDevice 的父级对 ICScannerDevice 的引用可以被视为 ICDevice 之一- 又名“向上”。

但是,已知引用是 ICDevice 类型的对象可能是也可能不是 ICScannerDevice比如说,可能是 ICPlotterDevice 。所以你不能直接转换 - 又名“向下转换”并分配。

必须首先检查您是否确实引用了 ICScannerDevice 。您可以通过使用方法isKindOfObject:检查引用对象的类型来完成此操作。 ,是类型ICScannerDevice ,您可以通过 class 获得该类型方法:

if ( [device isKindOfObject:[ICScannerDevice class]] )
{
// we have a reference to an ICScanner Device
scannerDevice = (ICScannerDevice *)device; // downcast and assign
...
}
else
{
// device references something other than an ICScannerDevice object
// handle this case
...
}

您还需要处理值存储在 device 中的情况是 nil - 即它没有引用任何内容。您可能只想将其与 if 中的测试结合起来。并将其视为 ICScannerDevice引用:

if ( (device == nil) || [device isKindOfObject:[ICScannerDevice class]] )

或者您可能需要以其他方式处理它。

HTH

关于objective-c - 如何在 Objective-C 中实例化指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35435155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com