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 indidParseSource
, wo ich es teste.2 Stimmen
Sind Sie sicher, dass Ihr UIWebViewScriptDebugDelegate ordnungsgemäß behalten wird? (Versuchen Sie es mit NSZombies)
0 Stimmen
Ich würde auch davon ausgehen, dass dies nichts mit dem Array selbst zu tun hat, sondern mit den Objekten, die Sie daran anhängen.
0 Stimmen
@fabrice: Das tue ich nicht. Ich nahm an, dass der Code überhaupt nicht aufgerufen wird, wenn der Delegat nicht behalten wird. Ich weiß nicht, was
NSZombies
sind, also gib mir etwas Zeit, um es zu googeln und mich zu melden. Danke.0 Stimmen
@MrBr: Die Objekte sind einfach
NSDictionary
en, und wieder einmal - es schlägt sogar fehl, wenn ich überhaupt nichts anhänge.0 Stimmen
Sie verwenden eine Klassenvariable in einer Delegatenmethode, die wahrscheinlich als informelles Protokoll definiert wurde! Ihre Klasse verwendet eine Delegatenmethode von Webscriptdebugdelegate, aber Ihre Klasse gibt nirgendwo an, dass sie diesem Protokoll entsprechen muss.
0 Stimmen
@fabrice: Ich habe es zum Laufen gebracht, indem ich einen Aufruf zu
objc_setAssociatedObject
mitOBJC_ASSOCIATION_RETAIN
beim Setzen des Delegaten eingefügt habe. Ich bin mir nicht sicher, ob dies der richtige Ansatz ist, und ich weiß auch noch nicht, wie ich es freigeben soll.