Teilweise hier beantwortet: NSArray Größe und Veränderbarkeit
NSMutableArray ist nicht merklich langsamer oder größer (speichertechnisch) als ein NSArray. Es ist im Grunde nur ein NSArray, das sich selbst neu zuordnet, wenn es voll ist, als größeres Array, und hält das tun, wie Sie Elemente zu ihm hinzufügen.
Der Grund für das Kopieren von veränderlichen Arrays als unveränderliche Arrays, wenn Sie sie Werten in Ihrer Klasse zuweisen, ist, dass Sie garantieren können, dass sich ihre Werte nicht ändern. Wenn Sie ein veränderbares Array in Ihrer Klasse speichern, kann anderer Code seine Werte außerhalb Ihrer Klasse ändern, ohne eine Ihrer Methoden aufzurufen. Das macht Sie anfällig für Abstürze aufgrund von internen Instabilitätsfehlern innerhalb Ihrer Klassen.
Nehmen wir zum Beispiel an, dass Sie beim Setzen des Arrays die Länge des Arrays als int-Eigenschaft in Ihrer Klasse zwischengespeichert haben. Das wäre in Ordnung, wenn das Array unveränderlich wäre, aber wenn es veränderbar wäre, könnte jemand anderes das Array ändern, und Ihr zwischengespeicherter Wert wäre jetzt falsch, aber Sie haben keine Möglichkeit, das zu wissen.
Es ist jedoch nicht notwendig, das Kopieren manuell durchzuführen. Wenn Sie Ihre Array-Eigenschaften deklarieren als:
@property (nonatomic, copy) NSArray *foo;
Wenn Sie dann object.foo ein Array zuweisen, wird es automatisch kopiert. Sie brauchen es nicht noch einmal selbst zu kopieren. Es ist am besten, eine Eigenschaft vom Typ copy anstelle von strong/retain für jeden Typ zu verwenden, der eine veränderbare Variante hat, wie zum Beispiel so:
@property (nonatomic, copy) NSArray *foo;
@property (nonatomic, copy) NSString *foo;
@property (nonatomic, copy) NSDictionary *foo;
@property (nonatomic, copy) NSData *foo;
etc...
Seien Sie jedoch vorsichtig, es nicht für veränderbare Eigenschaften zu verwenden, da sonst eine unveränderbare Kopie in einer Eigenschaft gespeichert wird, die denkt, dass sie veränderbar ist und einen Absturz verursacht, wenn Sie versuchen, sie zu verändern. Die synthetische Kopie Eigenschaft ist nicht intelligent genug, um mutableCopy automatisch zu verwenden.
@property (nonatomic, copy) NSMutableArray *foo; //don't do this