【问题标题】:xCode 9 ios 11 : Data's pointer inside struct losingxCode 9 ios 11:结构内的数据指针丢失
【发布时间】:2017-08-22 09:45:46
【问题描述】:

在我的应用程序中,我有一个struct,它包含我的所有数据。它适用于以前版本的 Xcode。但是当我使用 Xcode 9、beta 5 到 iOS 11 设备构建它时,里面的一些数据丢失了。 当我将 struct 对象作为函数的参数传递给另一个活动时,就会发生这种情况。

我的结构如下所示:

typedef struct {
    NSString *title;
    MainController *mainController;
    //....
    //....
    //more than 200 objects
} mystruct;

数据丢失后,当我尝试访问它时,Xcode 显示 [EXC_BAD_ACCESS] 并且应用程序崩溃。 Xcode 9 中的结构有大小限制吗?

更新 1: 添加创建和传递源

//declare struct
mystruct m;
memset(&m,0,sizeof(mystruct));
// setting data for struct
....
...
...
// passing param
[anotherObj showData:&m];

方法读取另一个对象的值:

- (void)showData:(mystruct *)ms
{
    // get data of struct
    [self showText : ms->title];
}

注意:仅在 xCode 9 和 iOS 11 上发生

  • xCode 9 + iOS 11 -> 错误
  • xCode 9 + iOS 10 -> 好的
  • xCode 8 + iOS 11 ->好的
  • xCode 8 + iOS 10 -> 好的
  • xCode 7 + iOS 11 -> 好的
  • xCode 7 + iOS 10 ->好的

【问题讨论】:

  • 请添加用于创建结构对象并传递它的代码。此外,带参数的函数代码。
  • 我添加了创建和传递源代码。
  • 你没有因为有一个带有引用的结构而收到警告吗?这是纯Objective-C,而不是Objective-C++?你使用 ARC 吗?
  • 感谢您的建议。我不使用 ARC。

标签: objective-c struct ios11 xcode9


【解决方案1】:

我自己解决了。原因是因为在 xCode 9 上构建应用程序时。它强制我的应用程序使用 64 位编译器构建。

Apple 文档中有一个关于 [Be Careful When Aligning 64-Bit Integer types] 的警告。但我没有注意到。 链接:Apple doc about aligning bit

然后,我就像他们教的那样添加 pragma,效果很好。

#pragma pack(4)
struct bar {
    int32_t foo0;
    int32_t foo1;
    int32_t foo2;
    int64_t bar;
};
#pragma options align=reset

另一种方式,我们可以先重组对齐值最大的元素,最后再排列最小的元素,以避免填充位。

@Amin Negm-Awad:感谢您的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    相关资源
    最近更新 更多