@property(只读)的含义void * data;在目标c中

时间:2019-05-24 06:58:56

标签: objective-c

我是iOS编程的新手,我更喜欢Swift语言,并且我不了解ObjectiveC。当我在某些库中徘徊时,我很快就得到了UnsafeMutableRawPointer类型的值,这实际上是一个带有utf8编码的字符串值。

所以我只是查看了相应的目标c类,并将变量声明为 @property (readonly) void *data;

那么为什么有空指针以及为什么将其转换为UnsafeMutableRawPointer

在目标c或c中将我视为菜鸟。

预先感谢

1 个答案:

答案 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转换后,您将收到不安全的可变原始指针。这意味着它在内存中占有一席之地,它不知道它是什么以及如何使用它。您可以尝试将其转换为所需的任何内容,但它不安全,因为它将忽略所有类型检查。它是可变的,可能是因为它保存的数据可能在任何给定时间由任何系统更改。它是原始,因为它不包含其他信息(例如字符串)。这是一个指针,因为它仅指向内存中的位置。

(所有代码片段都是象征性的,用以说明幕后发生的事情。请不要将其视为文字)