Seltsamer Leopard (NSURLCache-Probleme)

31/10/2007 - 16:04 von aclauss | Report spam
Ich habe von NSURLCache eine eigene Klasse abgeleitet, und diese
dann über [NSURLCache setSharedURLCache:myOwnCache] als globalen
Cache für das Cocoa-URL-Loading-System angemeldet. Generell benötige
ich nur für die Methode "cachedResponseForRequest:" eine Möglichkeit,
in gewissen Situationen eigene Cache-Inhalte zu liefern. D.h. die
Methode sieht dann so aus:


- (NSCachedURLResponse *)cachedResponseForRequest:
(NSURLRequest *)request
{
NSCachedURLResponse *result = nil;
if (die gewisse Situation liegt vor) {
result = eigene Cache-Response anlegen
} else {
result = [super cachedResponseForRequest:request];
}
return result;
}


Das klappt bis 10.4.10 einschließlich prima. Ab Leopard crasht das
zuverlàssig, sofern [super cachedResponseForRequest:request] aufgerufen
wird und(!) der Request im Cache auch vorhanden ist (also mein eigener
Code gar nicht erst zum Zuge kommt und somit auch nichts vermasseln
kann). Aufgrund des Crashlogs sieht das so aus, als ob das bei der
Freigabe der NSCachedURLResponse passiert, d.h. diese wird irgendwann
doppelt freigegeben. Ein "Fix" wàre, einfach ein "[result retain]" vor
das return result reinzusetzen. Allerdings müsste das eigentlich ein
Speicherleck bedeuten, da ich so ein fremdes Objekt "retaine", für
dessen Freigabe ja ein ganz anderes Objekt zustàndig sein müsste.

Habe ich da irgendwas übersehen, oder hat Apple da was verbockt?

Ich habe da weiter getestet und mal eine praktisch leere Klasse von
NSURLCache abgeleitet, die keine(!) eigenen Methoden definiert, selbst
die crasht. D.h. es sieht so aus, als ob die einzige(!) offizielle
Initialisierungsmethode von NSURLCache nicht ausreicht, um ein
NSURLCache-Objekt zu initialisieren, wenn es abgeleitet wird, oder
Cocoa-Intern wird geprüft, ob der Cache eine abgeleitete Klasse ist, und
wenn ja werden munter fremde Objekte freigegeben. Was hat Apple da denn
angestellt? Oder bin ich zu blöd?


Alexander
 

Lesen sie die antworten

#1 spamfalle2
12/12/2007 - 14:24 | Warnen spam
Alexander Clauss wrote:

Ich habe von NSURLCache eine eigene Klasse abgeleitet, und diese
dann über [NSURLCache setSharedURLCache:myOwnCache] als globalen
Cache für das Cocoa-URL-Loading-System angemeldet. Generell benötige
ich nur für die Methode "cachedResponseForRequest:" eine Möglichkeit,
in gewissen Situationen eigene Cache-Inhalte zu liefern. D.h. die
Methode sieht dann so aus:



-snip-

Das klappt bis 10.4.10 einschließlich prima.



Hmm.

Ein "Fix" wàre, einfach ein "[result retain]" vor
das return result reinzusetzen. Allerdings müsste das eigentlich ein
Speicherleck bedeuten, da ich so ein fremdes Objekt "retaine", für
dessen Freigabe ja ein ganz anderes Objekt zustàndig sein müsste.



Ist es vielleicht das?
A.Hillegass: Cocoa Programming for MacOS X, Chapter 3, p56:
Creating Autoreleased Objects


In a world without walls and fences,
who needs windows and gates?

Ähnliche fragen