iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   Object uit NSArray tweemaal gebruiken (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/68100-object-nsarray-tweemaal-gebruiken.html)

Niels2678 12-08-10 10:06

Object uit NSArray tweemaal gebruiken
 
Ik hoop dat iemand mij kan helpen met het volgende probleem.

Ik heb een array waarin ik allerlei images opsla. Nu wil ik elke image in die array 2 x gebruiken. Wat er dan gebeurd is dat de eerste image verdwijnt als ik de tweede image plaats.

Dit wordt volgens mij veroorzaakt omdat ik beide keer naar de zelfde referentie in het geheugen wijs en de image dus niet op 2 plekken te gelijk gezet kan worden. Maar wanneer ik copy gebruik crasht de app en krijg ik de melding dat ik method copyWithZone niet te gebruiken is.

Ook dat heb ik opgezocht en dat schijnt dus te komen omdat elke image in die array een custom class is.

Iemand een idee hoe ik dit op kan lossen?

TUX2K 12-08-10 10:28

Klinkt vreemt, maar als ik het goed begrijp wil je dus een en het zelfde plaatje twee keer toevoegen aan een array.
Dit zou mijn inziens gewoon moeten kunnen, maar misschien dat NSArray een pointer check doet.

Zou je code eens kunnen posten, dan wordt het na bouwen en test een stukje makkelijker. Misschien is er wel een weg om heen.

Niels2678 12-08-10 10:33

Citaat:

Oorspronkelijk geplaatst door TUX2K (Bericht 527512)
Klinkt vreemt, maar als ik het goed begrijp wil je dus een en het zelfde plaatje twee keer toevoegen aan een array.
Dit zou mijn inziens gewoon moeten kunnen, maar misschien dat NSArray een pointer check doet.

Zou je code eens kunnen posten, dan wordt het na bouwen en test een stukje makkelijker. Misschien is er wel een weg om heen.

Nee ik wil juist een plaatje 2 x uit een array ophalen en plaatsen op een view. De afbeeldingen zitten al goed in de array.

Hieronder het stukje code waar het over gaat:

NSArray *thumbs = [arrayThumbnails objectAtIndex:indexPath.section];

if([[thumbs objectAtIndex:indexPath.row] isKindOfClass:[AsyncImageView class]])
{
AsyncImageView *imaget = (AsyncImageView *)[[thumbs objectAtIndex:indexPath.row] copy];

[self showDetailViewWithInfo:onEvent withImage:imaget];
}
else
{
[self showDetailViewWithInfo:onEvent withImage:nil];
}

Ik hoop dat dit een stuk ophelderd!

TUX2K 12-08-10 10:38

Je hoeft geen copy te gebruiken, ja kan direct the image gebruiken.
Ik heb het idee dat je ergens de array op ruimt en de image released waardoor deze wordt opgeruimt, of dat je de pointer overschrijft met de twee image als je die gaat displayen.

Je code ziet er goed uit, in de functie showDetailViewWithInfo withImage, retain je daar de image (of in de viewcontroller/view die daar dan weer aan hangt?)

Whacko 12-08-10 12:09

TUX2K als hij een retain vergeten is zou het image gewoon te zien moeten zijn. Hij wordt pas opgeruimd als de retaincount op 0 staat. stel het wordt ergens vergeten en de retaincount staat op 1, kan je hem nog steeds op 10 plekken gebruiken, alleen weet het systeem niet waar hij allemaal gebruikt wordt.

Lijkt mij eerder dat er iets misgaat bij een draw functie ofzo die de vorige image overschrijft met een lege image of iets in die richting.

Misschien is het mogelijk wat meer code te plaatsen?

Niels2678 12-08-10 12:39

Ik zal even de code posten die hiermee te maken heeft:

Bij de initialisatie van de app tel ik alle table cell's en groepeer ze in categorieën en zet hier allemaal lege objecten voor in de plaats in een mutable array. (arrayThumbnails)

Wanneer de data wordt geladen van elke cell en deze cell een afbeelding heeft, plaats ik deze afbeelding in die array door het lege object te vervangen.(uiteraard op de goede plek)

AsyncImageView *asyncImage = [[AsyncImageView alloc] initWithFrame:CGRectMake(12.0f, 13.0f, 72.0f, 72.0f)];
asyncImage.tag = 500;
[asyncImage loadImageFromURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", onEvent.event_thumb]]];
[cell.contentView addSubview:asyncImage];

lijstItems = [arrayThumbnails objectAtIndex:indexPath.section];
[lijstItems replaceObjectAtIndex:indexPath.row withObject:asyncImage];
[arrayThumbnails replaceObjectAtIndex:indexPath.section withObject:lijstItems];

[asyncImage release]

Zo wordt dus mijn array opgevuld met afbeeldingen. (Zorgt voor het soepeler scrollen)

Daarna wil ik dus de image laten zien in de cell, dat doe ik alsvolgt:

lijstItems = [arrayThumbnails objectAtIndex:indexPath.section];
[cell.contentView addSubview:[lijstItems objectAtIndex:indexPath.row]];

Maar nu komt het volgende het 'probleem', als er nu een cell wordt geselecteerd dan komt er een nieuwe view tevoorschijn (met meer informatie dan in die cell) maar wil ik weer datzelfde plaatje daarin laten zien.
Maar als ik dan het plaatje opdezelfde manier ophaal, verdwijnt het plaatje dat in de cell stond.

Ik hoop dat ik het nu een beetje duidelijk heb kunnen maken.
Misschien dat jullie zien wat ik fout doe?

umbra989 15-08-10 09:45

Er valt me wel op dat in de code gebruik wordt gemaakt van NSArray en in de tekst je spreekt van een mutable array maar volgens mijn zit daar het probleem niet. Het lijkt er inderdaad op dat er sprake is van een memorymanagementvraagstuk, zeker omdat je het plaatje in een nieuwe view gebruikt. Maak anders een property aan op de subview van het type array waar je de thumbs array aan toewijst. Door met synthesize de property aan te maken is het memorymgt automatisch geregeld.


Alle tijden zijn GMT +2. Het is nu 04:14.