2010-09-16 4 views
0

J'ai une sorte de question simple. J'écris un programme Objective-C avec un peu de multithreading. J'ai un NSArray global, et j'ajoute des objets dans ce NSArray à partir d'une méthode qui est appelée dans un nouveau thread. Si les objets que j'ajoute dans ce NSArray sont de nouveaux objets créés dans cette méthode (local), cela créera-t-il un accès mémoire et/ou d'autres problèmes ou le garbage collector sera-t-il assez intelligent pour garder ces objets jusqu'à ce qu'ils n'aient plus de références? Aussi, si je veux un objet dans ce NSArray, cet objet sera-t-il passé par référence ou par valeur?Multithreading Objective-C et des conteneurs de données

+0

Qu'entendez-vous par "accès mémoire"? Voulez-vous dire "condition de course"? – vodkhang

+0

Carl a déjà répondu à ma question, mais je veux dire, est-ce que je vais jamais accéder à un emplacement de mémoire qui est hors de ma portée ou à un emplacement auquel je n'ai pas accès en dehors du thread qui a créé l'objet. – hassaanm

Répondre

0
  1. Pouvez-vous ajouter des objets dans NSArray? Je suppose que vous voulez dire NSMutableArray. NSMutableArray n'est pas sûr pour les threads. Vous devrez donc peut-être acquérir un verrou avant d'essayer de le modifier. Bien que cela dépendra principalement de la façon dont vos threads travaillent sur des données partagées. NSArray ou NSMutableArray conservent les objets qu'ils contiennent. Donc, après l'ajout, vous pouvez libérer la copie locale.
  2. Le tableau stockera la référence.

Espérons que cela aide. En général, le multithreading est beaucoup plus difficile qu'une application unique. Veuillez vérifier Threading Programming Guide pour les détails. Cela peut vous éviter de nombreux dangers.

+0

Oui, je voulais dire NSMutableArray. – hassaanm

+0

MERCI POUR L'AIDE! – hassaanm

0

Il ne devrait pas y avoir de problèmes avec le design que vous décrivez. Tous vos threads partagent le même espace mémoire, donc tout ira bien. Le système de gestion de la mémoire fera "la bonne chose", mais je recommande d'apprendre la méthode retenir/libérer - il n'y a rien de mieux que réellement comprendre ce que votre programme est en train de faire. Objective-C est une valeur de passe seulement, tout comme C. Cela dit, les objets ne sont jamais transmis que par des pointeurs en Objective-C, donc on peut toujours penser à ça dans ce sens.

+0

Merci! Je viens de mettre à jour mon message avec une autre question. Pourriez-vous jeter un coup d'œil à celui-là aussi? – hassaanm

+0

@hassaanm, édité. Méfiez-vous des problèmes de threading potentiels que mentionne @taskinoor dans sa réponse. –

+0

Cela ne devrait pas être downvoted. Il contient également des informations utiles et rien n'est techniquement faux. – taskinoor