xCode 9 ios 11: указатель данных внутри структуры теряется

В моем приложении у меня есть struct, и он содержит все мои данные. Он хорошо работает с предыдущей версией Xcode. Но когда я создаю его с помощью Xcode 9, бета-версии 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 -> ОК

person DucVN    schedule 22.08.2017    source источник
comment
Пожалуйста, добавьте код для создания объекта структуры и его передачи. При этом код функции, принимающей параметр.   -  person Amin Negm-Awad    schedule 22.08.2017
comment
я добавил создание и передачу исходного кода.   -  person DucVN    schedule 23.08.2017
comment
Разве вы не получали предупреждений о наличии структуры со ссылками? Это чистый Objective-C, а не Objective-C++? Вы пользуетесь АРК?   -  person Amin Negm-Awad    schedule 23.08.2017
comment
спасибо за ваше предложение. Я не использую АРК.   -  person DucVN    schedule 23.08.2017


Ответы (1)


Я решил это сам. Причина в том, что при сборке приложения на xCode 9 . Это заставляет мое приложение собирать с помощью 64-битного компилятора.

В документе Apple было предупреждение о [Будьте осторожны при выравнивании 64-битных целочисленных типов]. Но я этого не заметил. Ссылка: Документ Apple о выравнивании битов

Затем я просто добавил прагму, как они учат, и это сработало.

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

Другой способ, мы можем реорганизовать элементы с наибольшими значениями выравнивания первыми, а наименьшие элементы последними, чтобы избежать бита заполнения.

@Amin Negm-Awad: спасибо за помощь

person DucVN    schedule 23.08.2017