6
votes

allouer une quantité spécifique de mémoire dans Swift - iOS

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)}


0 commentaires

3 Réponses :


6
votes

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:

 Entrez la description de l'image ici

Vous voyez que la répartition a été effectuée avec un espace supplémentaire.

Si nous vous changeons Fonction à la mémoire préventive: xxx

Nous verrons ceci:

 Entrez la description de l'image ici

Mise à jour # 1

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.

À 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 mais également 8 mégaoctets avec appelant _dispatch_alloc_try_create_heap . 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.


2 commentaires

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.



0
votes

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
}


1 commentaires

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); :)



1
votes

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
}


2 commentaires

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