J'apprends des instruments d'apprentissage, vous avez donc créé une application simple qui permet à l'utilisateur de saisir un certain nombre de méga octets (MB) à attribuer. Et j'utilise l'outil "Allocations" dans les instruments pour vous assurer que cette quantité exacte de données est attribuée. Cependant, je vois toujours plus de mémoire alloué dans des instruments que j'attends.
J'ai fait le suivant P>
func allocateMemoryOfSize(numberOfBytes: Int) { var imageData = UnsafeMutablePointer<Int8>.alloc(numberOfBytes)}
3 Réponses :
Dans le premier cas lorsque vous appendez des octets à votre tableau en interne, il utilise la réaffectation lorsqu'il n'y a pas d'espace libre. Cette réaffectation double généralement la taille de la matrice actuelle. Voici comment il a l'air:
Vous voyez que la répartition a été effectuée avec un espace supplémentaire. P>
Si nous vous changeons Fonction à la mémoire préventive: p> Nous verrons ceci: p> Mise à jour # 1 p> L'allocation avec un pointeur dangereux fonctionnera également. Le principal inconvénient est la gestion de la mémoire manuelle: vous devez le distribuer explicitement. P> À propos du résumé de l'allocation: lorsque vous allouez la mémoire, des allocations système se produisent également. Dans ma capture d'écran, vous pouvez voir que non seulement 10 mégaoctets alloués à l'appelant swift.slowalloc code> mais également 8 mégaoctets avec appelant
_dispatch_alloc_try_create_heap code>. Vous verrez donc sur le graphique que l'application utilise 18 mégaoctets au lieu de 10. Je ne sais pas pourquoi cette allocation système se produit également parce que c'est iOS Internals. Je pense que vous devez faire attention uniquement sur vos allocations. Dans mon exemple, je vois que 10 mégaoctets ont été demandés et donnés à l'application. P> p>
Merci beaucoup, John! J'ai juste quelques commentaires: 1- Cela a fonctionné lorsque j'ai supprimé la boucle de la boucle lorsque je suis entré à 10 mbs, il a alloué exactement 10 Mo. Avec la boucle pour la boucle, il a alloué environ 15 mbs. Probablement la boucle de la boucle avait besoin de la mémoire aussi. Donc, je vous suggère de supprimer la boucle de votre réponse. 2- Je comprends votre explication de l'allocation de la matrice, mais pourquoi l'appel de réseau mutable dangerable est-il attribué davantage de mémoire? Merci beaucoup!
Je pense que pour la boucle n'affecte pas l'allocation. J'ai mis à jour ma réponse avec quelques explications sur le résumé de l'allocation.
J'ai fait ceci:
static var buffer = [UInt8]() static func allocateMemoryOfSize(numberOfMegaBytes: Int) { print("Allocating \(numberOfMegaBytes)MB of memory") let mb = 1048576 let newBuffer = [UInt8](count: numberOfMegaBytes * mb, repeatedValue: 0) buffer += newBuffer }
Je ne peux pas m'empêcher de penser à combien j'aime pas Pascal: var données: Pbyte; Données: = Allocmem (partance); Zeromemory (données, en avant); :)
SWIFT 3.1:
static var buffer = [UInt8]() static func allocateMemoryOfSize(numberOfMegaBytes: Int) { print("Allocating \(numberOfMegaBytes)MB of memory") let mb = 1048576 let newBuffer = [UInt8](repeating: 0, count: numberOfMegaBytes * mb) buffer += newBuffer }
Si vous ajoutez des données dans la matrice statique, vous ne pouvez pas le distribuer lorsque votre contrôleur de vue est détruit
C'est l'objectif: D