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/)
-   -   NSData dataWithContentsOfURL leaks. (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/34979-nsdata-datawithcontentsofurl-leaks.html)

markvwijnen 04-06-09 20:49

NSData dataWithContentsOfURL leaks.
 
Heej,

Ik vroeg me af of iemand wist waarom dataWithContentsOfURL van NSData leaked?

Naboots code:
NSData *content = [NSData dataWithContentsOfURL:url];

LEAK!

Dan plaatsen we er een [content release]; bij, wat niet logisch is want je verwacht een auto released object terug, maar het zou kunnen dat Apple een foutje heeft gemaakt. We builden het weer.

CRASH!

Fijn. Alle manieren van contentsOfURL via NSData leaken.

Omzeil oplossing
NSError *error = nil;
NSString *tmpContent = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:&error];
NSData *content = [tmpContent dataUsingEncoding: NSASCIIStringEncoding];

LEAK en CRASH vrij.

Malork 04-06-09 20:59

Hoezo verwacht je een autoreleased object terug...? je Alloceert hem,dus ben je zelf verantwoordelijk voor de release...

Volgens mij zou het niet mogen crashen, tenzij je de release eerder aanroept (onwaarschijnlijk) of je content-alloc in een if-statement doet, waardoor hij gereleased wordt terwijl het object al eerder gereleased is of niet bestaat.

markvwijnen 04-06-09 21:01

Citaat:

Oorspronkelijk geplaatst door Malork (Bericht 291900)
Hoezo verwacht je een autoreleased object terug...? je Alloceert hem,dus ben je zelf verantwoordelijk voor de release...

Woops foutje was aan het proberen om te kijken of als ik het zelf zou allocaten en releasen het probleem niet zou ontstaan, maar dat lukte niet en heb ik de oude code hier geplaatst, my bad, heb het aangepast.

Code:

NSData *data    = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.answersingenesis.org/assets/images/articles/aqua/Bottlenose_Dolphin.jpg"]];
UIImage *image = [[UIImage alloc] initWithData:data];
       
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[contentViewController.view addSubview:imageView];
       
[data release];
[image release];

Dit lijkt geen leak te geven. Vreemd.

danielpunt 05-06-09 11:17

Vaak is het zo dat als je een leak ziet uit UIKit of Foundation is het iets dat daar uit een object gecreëerd hebt, zelf retained en niet released. Leaks in UIKit en Foundation zijn erg zeldzaam, er werken heel veel mensen aan en het meeste is al gefixed.

als eerste moet je altijd kijken in je eigen code.


Alle tijden zijn GMT +2. Het is nu 21:42.