2017-08-22 1 views
1

Dans mon application, j'ai un struct et il contient toutes mes données. Cela fonctionne bien avec la version précédente de Xcode. Mais quand je le construis avec Xcode 9, beta 5 à iOS 11, certaines données à l'intérieur sont perdues. Cela se produit lorsque je transmets l'objet struct en tant que paramètre par fonction à une autre activité.xCode 9 ios 11: Pointeur de données à l'intérieur de la structure perdant

Mon struct ressemble ci-dessous:

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

Après la perte de données, lorsque je tente d'accéder Xcode montre [EXC_BAD_ACCESS] et application se bloque. Y a-t-il des limites de taille pour les structures dans Xcode 9?

MISE À JOUR 1: add source la création et la transmission

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

Méthode valeur lue d'un autre objet:

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

REMARQUE: Il ne se produit que sur xCode 9 et iOS 11

  • xCode 9 + iOS 11 -> Erreur
  • xCode 9 + iOS 10 -> OK
  • xCode 8 + iOS 11 -> OK
  • xCode 8 + iOS 10 -> OK
  • xCode 7 + iOS 11 -> OK
  • xCode 7 + iOS 10 -> OK
+2

Veuillez ajouter le code pour créer l'objet structure et le transmettre. De plus le code de la fonction prenant le paramètre. –

+0

J'ai ajouté la création et le passage du code source. – DucVN

+0

N'avez-vous pas reçu d'avertissement pour avoir une structure avec des références? C'est purement Objective-C, pas Objective-C++? Utilisez-vous ARC? –

Répondre

1

Je l'ai résolu par moi-même. La raison en est que lorsque l'application de construction sur xCode 9. Il force mon application à se compiler avec un compilateur 64 bits.

Apple Doc a émis un avertissement à propos de [Soyez prudent lors de l'alignement des types entiers 64 bits]. Mais je ne l'ai pas remarqué. Lien: Apple doc about aligning bit

Ensuite, je viens d'ajouter pragma comme ils enseignent et cela a bien fonctionné.

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

Une autre façon, nous pouvons réorganiser les éléments avec les plus grandes valeurs d'alignement premier et les éléments les plus petits derniers pour éviter peu de rembourrage. @Amin Negm-Awad: Merci pour votre aide