9
votes

Avertissement de mémoire reçue puis crash

Je veux afficher plusieurs images dans ScrollView quand les images sont plus de 70 applications s'écrasera et affichera une erreur de mémoire reçue.Je ont obtenu les images du répertoire de documents

J'ai essayé - xxx

Comment puis-je afficher plusieurs images dans ScrollView?


8 commentaires

Pouvez-vous s'il vous plaît expliquer pourquoi vous utilisez si (x <= 211)? Essayez-vous de montrer toutes les images à horizontale ou verticale?


ScrollView n'est pas une meilleure approche pour montrer plusieurs images. Uicollectionview est une meilleure approche pour montrer l'image parce que sa réutilisable. Dans ScrollView à chaque fois que vous affectation de mémoire, toutefois, l'application se bloque ou prendra trop de charge.


J'ai essayé à la fois UiscrolView et Uicollectionview mais que les résultats sont identiques.


Il sera préférable d'utiliser Uicollectionview au lieu de ScrollView comme dans la vue Uicollection, nous sommes en mesure de créer une cellule réutilisable.


@sohil s'il vous plaît consommez votre prime de manière meilleure, vous consommez la période de grâce maintenant


@sohil Supprimer la vue de la vue et utiliser la vue de collection


Parce que la vue de défilement maintient continuellement la vue de la mémoire et de la collection libérera la mémoire si nécessaire


Merci @kaushikMovaliya pour avoir répondu à une très vieille question. Alors, quelle est la solution? Aidez-moi, s'il vous plaît.


7 Réponses :


2
votes

Vous allouez et continuez d'ajouter les images qui causant l'accident de la mémoire comme toutes les images prenant la mémoire de périphérique, il existe de nombreuses solutions qui construisent pour montrer les images et le mieux utilisent l'uicollectionview qui charge uniquement les images qui montrent le filtrer. Vous allez pour n'importe quel bon tutoriel qui peut vous montrer comment le faire, voici le Référence < / a>


1 commentaires

désolé ce n'est pas le travail que j'ai utilisé uicollectionview, UitailView et ScrollVoir tous sont les mêmes résultats.Je ont obtenu les images du répertoire de documents



0
votes

Vous pouvez essayer avec utableview. Supposons que vous ayez N nombre d'images alors -

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }
        - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
        {
            // 3 is numbers of images per row
            if (n/3 *3 == n)
                return  n/3;

            return n/3 +1;
        }

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;

    }


    int x=5,y=15;

   UIImageView* imgView1=[[UIImageView alloc]initWithFrame:CGRectMake(x, y, 93, 110)];
   imgView1.image=[UIImage imageNamed:[imgarr objectAtIndex:indexPath.row + 0]];
    x+=103;

   UIImageView* imgView2=[[UIImageView alloc]initWithFrame:CGRectMake(x, y, 93, 110)];
    imgView2.image=[UIImage imageNamed:[imgarr objectAtIndex:indexPath.row + 1]];

    x+=103;

    UIImageView* imgView2=[[UIImageView alloc]initWithFrame:CGRectMake(x, y, 93, 110)];
    imgView2.image=[UIImage imageNamed:[imgarr objectAtIndex:indexPath.row + 2]];


    [cell.contentView addSubview:imgView1];
     [cell.contentView addSubview:imgView2];
     [cell.contentView addSubview:imgView3];
    return cell;

}


1 commentaires

Avez-vous essayé ce qu'est-ce que "[imgarr uteTindex: indexpath.row + 0]" est retourné. Je pense qu'il affiche des images en double.



5
votes
Create custom class of collection view cell 
and You can pass image name in array. 

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UICollectionViewDataSource,UICollectionViewDelegate>

@property (weak, nonatomic) IBOutlet UICollectionView *Collection;

@end

#import "ViewController.h"
#import "CustomCell.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.Collection registerClass:[CustomCell class] forCellWithReuseIdentifier:@"cell"];
    [self.Collection registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellWithReuseIdentifier:@"cell"];
}

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 5;
}
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 4;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell * cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    cell.imgview.image=[UIImage imageNamed:@"XYZ.png"];
    return cell;
}

0 commentaires


10
votes

Le conseil d'autres personnes ont donné pour passer à un uicollectionview est bon, mais il a manqué la vraie faille de votre code: la méthode Imagenamed: de uiImage conserve toutes les 70 de vos images en mémoire pour toujours. Par les docs:

Si vous avez un fichier image qui ne sera affiché qu'une fois et souhaite Assurez-vous de ne pas être ajouté au cache du système, vous devriez Créez plutôt votre image à l'aide de l'imageWithContentsOffle :. Cette volonté Gardez votre image à usage unique hors du cache de l'image système, potentiellement Améliorer les caractéristiques d'utilisation de la mémoire de votre application.

La commutation sur cette méthode empêchera les crashs, si vous ne vous chargeez que dans la mémoire que vous avez besoin. UicollectionView rend ce trivial, car vous ne pouvez que charger l'image lorsque la vue Collection vous demande de remplir un objet cellulaire dans son CollectionView: CORETFORITEMATDEXPATH: Méthode.


0 commentaires

0
votes

Utilisez @AutyeleeePool. Voici des détails sur @autoreleaspool

La relevé @AutyeleeePool fait le même travail qu'auparavant, au lieu d'utiliser la classe NsAutoreleeePool. La façon dont le NsautoreleeePool a travaillé était un peu bizarre, car la création d'un effet sur l'ensemble de l'application; @AutyeleeePool crée une zone étendue et rend plus claire ce qui se trouve dans la piscine et quand il se draine (quand il est hors de portée). Il est également plus efficace selon Apple.

Le concept d'une piscine Autoréleuillet est simple, chaque fois qu'une instance d'objet est marquée comme AutoReleed (par exemple Nstring * Str = [[[[[[Nstring Alloc] Initwithstring: @ "Bonjour"] Autoréleuil];), il aura une conserver Compte de +1 à ce moment-là, mais à la fin de la boucle de course, la piscine est drainée et tout objet marqué Autoréleuillet a alors son retenue décompte décrémentée. C'est une façon de garder un objet autour pendant que vous vous préparez tout ce qui le conservera pour lui-même.

avec arc, tandis que le mot clé Autoréleuillet n'est pas utilisé par le développeur, le système sous-jacent qui gère les insertions d'arc qui vous convient. (Rappelez-vous: tout arc fait est d'insérer des appels de conserver, de libération et d'autorelease pour vous à la période appropriée). Pour cette raison, le concept d'AutoreleePool existant doit rester autour.

Si vous retirez la piscine Autoréleuillet, vos objets vont commencer à fuir Pour plus de détails Vérifiez ici


0 commentaires

1
votes

J'ai également fait face à ce même problème que j'ai résolu à l'aide de la ligne simple.

au lieu d'utiliser ceci: code> p> xxx pré>

Essayez d'utiliser ceci: CODE> P>

[yourCell.imageview setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"yourImage" ofType:@"png"]]];


4 commentaires

UIIMAGE ImageWithContentsOffile:] Est-ce que consume la mémoire - c'est juste que ce ne sera pas permanent. En outre, juste parce que vous peut obtenir des images de toute URL à l'aide de cette méthode ne signifie pas que vous devrait ; Cette méthode est synchrone et ne doit donc jamais être appelée à partir du fil principal dans un tel scénario.


Oui, et c'est pourquoi le questionnaire avait un problème. Cette mémoire sera libérée. et deuxièmement, l'URL dépend de la logique du questionnaire. Son juste une option mon pote. et encore une chose. Avez-vous vaincu et commenté cela pour justifier votre bowvote?


Vous dites "ne consomme pas de mémoire", pas "ne reste pas en mémoire après sa publication." Il y a une grande différence. Quant à la chose "URL distante", ce n'est qu'une option si vous ne vous souciez pas de la qualité de votre logiciel. La documentation Apple sur des méthodes similaires ( [nsdata DatawithContentsofurl:] ) explicitement dit de ne pas faire cela.


Vous ne pouvez pas simplement modifier ma réponse au lieu de la descendre ...?