2 Stimmen

Müll im (strong) Objective C-Eigenschaft innerhalb eines Delegierten

Ich bin neu in Objective C, also bitte verzeihen Sie meine Unwissenheit. Ich versuche, diesen Code zum Laufen zu bringen, leider ohne Erfolg.

In meiner Header-Datei habe ich eine Eigenschaft deklariert:

@interface UIWebViewScriptDebugDelegate : NSObject

@property (nonatomic, strong) NSMutableDictionary *sourceIDMap;

@end

In meiner Code-Datei synthetisiere und initialisiere ich es:

@implementation UIWebViewScriptDebugDelegate

@synthesize sourceIDMap = sourceIDMap_;

- (id)init
{
    if ((self = [super init])) {
        self.sourceIDMap = [[NSMutableDictionary alloc] init];
    }

    return self;
}

Es funktioniert sehr gut - wenn ich einen NSLog Aufruf einfüge, sehe ich, dass self.sourceIDMap tatsächlich ein Dictionary ist. Allerdings, wenn ein anderer Methode auf die Eigenschaft zugreifen möchte, scheint es, dass NSMutableDictionary verschwunden ist.

- (void) webView:(WebView*)webView
  didParseSource:(NSString*)source
  baseLineNumber:(unsigned int)baseLineNumber
         fromURL:(NSURL*)url
        sourceId:(int)sourceID
     forWebFrame:(WebFrame*)webFrame
{
    // ...

    NSLog(@"Schauen Sie mal, was wir hier haben:");
    NSLog(@"%@", self.sourceIDMap);
}

Manchmal ist es eine DOMCSSStyleDeclaration, manchmal ist es eine DOMHTMLHeadElement:

360 MyApp[49113:1507] Schauen Sie mal, was wir hier haben:
360 MyApp[49113:1507] 
361 MyApp[49113:1507] -[DOMCSSStyleDeclaration sourceIDMap]: unrecognized selector sent to instance 0xc32e550
361 MyApp[49113:1507] *** WebKit hat eine unbehandelte Ausnahme im webView:didParseSource:baseLineNumber:fromURL:sourceId:forWebFrame: Delegierten verworfen:  -[DOMCSSStyleDeclaration sourceIDMap]: unrecognized selector sent to instance 0xc32e550
367 MyApp[49113:1507] Schauen Sie mal, was wir hier haben:
368 MyApp[49113:1507] 
369 MyApp[49113:1507] -[DOMHTMLHeadElement sourceIDMap]: unrecognized selector sent to instance 0x145ec820
369 MyApp[49113:1507] *** WebKit hat eine unbehandelte Ausnahme im webView:didParseSource:baseLineNumber:fromURL:sourceId:forWebFrame: Delegierten verworfen:  -[DOMHTMLHeadElement sourceIDMap]: unrecognized selector sent to instance 0x145ec820

Wo ist das NSMutableDictionary? Sollte es nicht behalten werden?

Update

Wenn das hilft, wird der Code in eine statische Bibliothek mit aktiviertem ARC kompiliert, die ich von MonoTouch aus aufrufe.

0 Stimmen

Kannst du den Code posten, wo du tatsächlich Daten in das NSMutableArray einfügst?

0 Stimmen

@MrBr: Der Punkt ist: Ich tue es nicht. Ich habe den gesamten Code entfernt, der auf das Wörterbuch zugreift, außer in init, wo es erstellt wird, und in didParseSource, wo ich es teste.

2 Stimmen

Sind Sie sicher, dass Ihr UIWebViewScriptDebugDelegate ordnungsgemäß behalten wird? (Versuchen Sie es mit NSZombies)

0voto

Dan Abramov Punkte 252334

Es hat funktioniert, als ich hinzugefügt habe

objc_setAssociatedObject(sender,
    @"ScriptDebuggerDelegate", delegate, OBJC_ASSOCIATION_RETAIN
    );

bevor ich setScriptDebugDelegate: auf sender in didClearWindowObject aufrufe.

Dank geht an fabrice truillot de chambrier für den Tipp.
(Es scheint, als ob ich es nicht einmal selbst freigeben muss.)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X