我是iOS编程的新手,我更喜欢Swift语言,并且我不了解ObjectiveC。当我在某些库中徘徊时,我很快就得到了UnsafeMutableRawPointer
类型的值,这实际上是一个带有utf8编码的字符串值。
所以我只是查看了相应的目标c类,并将变量声明为
@property (readonly) void *data;
那么为什么有空指针以及为什么将其转换为UnsafeMutableRawPointer
?
在目标c或c中将我视为菜鸟。
预先感谢
答案 0 :(得分:2)
对于初学者来说,整件事可能很多。因此,让我们从ObjectiveC语法开始:
属性@property (readonly) void *data;
公开了表示必须有- (void *)data
类型的方法的接口,这意味着实例方法将返回void
指针。空指针是指向任何东西的指针。
ObjectiveC在某种程度上更像是纯C。我不会检查确切的转换,但是由于C没有方法,所以所有这些操作都是通过函数甚至函数的指针完成的。因此,在下面的某个地方应该有一个函数(假设此类的名称为MyDataClass
)
void *myDataClass_data(MyDataClass *self) { return self->_data; } // Or whatever the implementation is
因此,没有什么真正有趣的事情在后台进行。整个过程只返回内存中的一个位置,而没有任何关于应该存在的内容的进一步信息。作为开发人员,您必须了解并解释它。从C(或ObjectiveC)开始,这非常简单。一些例子:
char *aString = (char *)myDataClass.data; // A pure C string. Expected to be null terminated
int *arrayOfIntegers = (int *)myDataClass.data; // An array of integers
int thirdItem = arrayOfIntegers[2];
MyDataClass *nextItem = (MyDataClass *)myDataClass.data; // A pointer to another instance
for(MyDataClass *iterator = myDataClass; iterator != nil; iterator = (MyDataClass *)iterator.data) {}
我希望你能明白。关键是,就数据类型而言,C和ObjectiveC都是非常不安全的。您基本上可以将任何内容转换为任何内容,然后它将进行编译。问题是运行时会发生什么。
查看Swift时,事情变得更加安全,您不能只说let integer: Int = myDataClass as Int
之类的话。您可以强制施放它,否则它将崩溃。或者,您可以执行可选的强制转换,它将返回nil
。
因此,从C / ObjectiveC转换后,您将收到不安全的可变原始指针。这意味着它在内存中占有一席之地,它不知道它是什么以及如何使用它。您可以尝试将其转换为所需的任何内容,但它不安全,因为它将忽略所有类型检查。它是可变的,可能是因为它保存的数据可能在任何给定时间由任何系统更改。它是原始,因为它不包含其他信息(例如字符串)。这是一个指针,因为它仅指向内存中的位置。
(所有代码片段都是象征性的,用以说明幕后发生的事情。请不要将其视为文字)