【问题标题】:Why doesn't objective-c allow pointers to a struct?为什么objective-c 不允许指向结构的指针?
【发布时间】:2016-12-30 07:00:26
【问题描述】:

我想知道为什么 Objective-c (ARC) 不允许我使用指向结构的指针(在本例中为 NSPoint)

我的代码在没有代码的情况下也可以工作,我只是想问一下为什么它不允许这样做,因为我没有在 Google 上找到它的原因。

我目前的猜测是因为结构不能包含对象,但我想再次检查一下;并想知道结构本身的保存位置。谢谢!

【问题讨论】:

  • 您可以使用指向结构的指针。你能提供一些代码吗?
  • NSPoint point = NSMakePoint(1.23, 4.56); NSPoint * pointPointer = &point; 工作正常。你想用指针做什么?
  • 我的意思是,NSPoint *point = NSMakePoint(1.5,1.6) 不起作用,但 NSPoint point = NSMakePoint(1.5,1.6) 起作用,因为 NSMakePoint 返回一个 NSPoint,而不是 NSPoint *,我想知道为什么会这样;如果这仅适用于结构(我不会对类做同样的事情)
  • Objective-C 非常乐意使用指向结构的指针。您给出的示例(NSPoint *point = NSMakePoint(1.5,1.6) 是无效代码;NSMakePoint() 返回一个结构,而不是指向结构的指针,因此您不能将其分配给指针。如果您想创建一个函数(或方法,或块,或属性,或...)返回指向结构(或联合,或枚举,或int,或float,或char,...)的指针,Objective-C 不会阻止你。跨度>
  • 因为接口类型(即 NSString 是什么)不能静态分配。

标签: objective-c pointers struct


【解决方案1】:

当迁移到 ARC 时,编译器不再允许这样做,因为包含对象指针的结构将被初始化、复制、移动或销毁的复杂性。

Apple 在 Transitioning to ARC 指南行的“ARC Enforces New Rules”部分中指出了这一点。

  • 不能在 C 结构中使用对象指针。

    • 您可以创建一个 Objective-C 类来管理数据,而不是使用结构 而是。

但是,从 this commit 开始,现在 LLVM 中允许这样做。

直接引用提交信息:

不允许在结构中声明 __strong 指针字段 Objective-C ARC 直到现在,因为这会使结构 对默认初始化、复制/移动和销毁来说非常重要,即 不是 C 旨在做的事情。这个补丁解除了这个限制。

非平凡 C 结构的特殊函数被合成,它们是 需要默认初始化、复制/移动和销毁结构和 管理 __strong 指针字段指向的对象的所有权 到。传递给函数的非平凡结构在 被调用函数。

【讨论】:

    猜你喜欢
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2016-07-24
    • 2021-07-14
    • 1970-01-01
    相关资源
    最近更新 更多