Frage

Ich bin neu in Objective-C, und ich habe keine Ahnung, warum dieser Code nicht funktioniert:

    NSMutableDictionary *bookmarks = [NSMutableDictionary dictionaryWithCapacity:(NSUInteger) 4];
[bookmarks setObject:@"Stanford University" forKey:[NSURL URLWithString:(NSString *) @"http://www.stanford.edu"]];
[bookmarks setObject:@"Apple" forKey:[NSURL URLWithString:(NSString *) @"http://www.apple.com"]];
[bookmarks setObject:@"Berkeley" forKey:[NSURL URLWithString:(NSString *) @"http://www.berkeley.edu"]];
[bookmarks setObject:@"CS193P" forKey:[NSURL URLWithString:(NSString *) @"http://cs193p.stanford.edu"]];

NSEnumerator *browser = [bookmarks keyEnumerator];
id each;
NSURL *url;
while ((each = [browser nextObject])) {
    url = [browser valueForKey:(NSString *)each];
    NSLog(@"%@", [url absoluteURL]);
}

Der Fehler ich erhalte, ist:

2009-06-29 11:25:22.844 WhatATool[2102:10b] *** -[NSURL length]: unrecognized selector sent to instance 0x1072c0
2009-06-29 11:25:22.845 WhatATool[2102:10b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL length]: unrecognized selector sent to instance 0x1072c0'

Jede Hilfe wäre sehr geschätzt. Danke.

War es hilfreich?

Lösung

Taste ist das, was Sie ein Objekt zugreifen verwenden, um im Wörterbuch. Sie haben Ihre Schlüssel und Objekte in jeder Zeile umgekehrt Sie -[bookmarks setObject:... forKey...] im Code aufrufen. Das Problem in Ihrem Fall ergibt sich, weil Sie versuchen, NSURL Objekte als NSString Objekte zu behandeln - [bookmarks objectForKey:(NSString *)each] - und das Wörterbuch versucht zu bekommen, die Länge der vermeintlichen Zeichenfolge durch den Aufruf -length, die für NSString existiert, aber nicht für NSURL

Wenn Sie immer ein Wörterbuch mit den gleichen Objekten konstruieren, sollten Sie mit einem kompakteren „varargs“ Konstruktor für NSDictionary. (Beachten Sie, dass das letzte Komma getrennt Argument null sein muss - siehe die zugehörige Dokumentation ) Sie können auch ein href verwenden <=" http://developer.apple.com/documentation/Cocoa/Reference/ Klassen-Stiftung / / NSDictionary_Class / Reference / reference.html # // apple_ref / occ / clm / NSDictionary / dictionaryWithObjects: forKeys:“rel = "nofollow noreferrer"> -[NSDictionary dictionaryWithObjects:forKeys:] mit zwei NSArray Objekte, die URLs und das Lesezeichen enthält, Name. (Übrigens Stringliterale als NSString* Gießen eines NSURL zu schaffen, ist völlig unnötig.)

NSDictionary *bookmarks = [NSDictionary dictionaryWithObjectsAndKeys:
                           [NSURL URLWithString:@"http://www.stanford.edu"],
                           @"Stanford University",
                           [NSURL URLWithString:@"http://www.apple.com"],
                           @"Apple",
                           [NSURL URLWithString:@"http://www.berkeley.edu"],
                           @"Berkeley",
                           [NSURL URLWithString:@"http://cs193p.stanford.edu"],
                           @"CS193P",
                           nil];

Darüber hinaus haben Sie einen Fehler lauert, die noch nicht erwähnt wurde: browser ein NSEnumerator ist, aber Sie anrufen valueForKey: , als wäre es ein NSDictionary statt auf bookmarks . Das wird einen ähnlichen Absturz für einen nicht erkannten Wähler auch verursachen. (Auch für Dictionary-Objekte, sollten Sie -objectForKey: statt; wird -valueForKey: verwendet hauptsächlich für / von

Andere Tipps

Sie haben die Lesezeichen-Wörterbuch intiialization umgekehrt:

[bookmarks setObject:@"Stanford University" forKey:[NSURL URLWithString:(NSString *) @"http://www.stanford.edu"]];

Sollte sein:

[bookmarks setObject:[NSURL URLWithString:(NSString *) @"http://www.stanford.edu"] forKey:@"Stanford University"];

Außerdem gibt es einen einfacheren Weg Aufzählung zu tun:

NSURL *url;
for ( NSString *each in [bookmarks allKeys] ) 
{
        url = [browser objectForKey:(NSString *)each];
        NSLog(@"%@", [url absoluteURL]);
}

Sie können auch aufzählen durch [Lesezeichen allValues] direkt unter dem URL-Objekt zu erhalten, anstatt die Schlüssel immer zuerst aus (obwohl Sie auch die Schlüssel aus einem anderen Grunde mögen).

Ich glaube, Sie in Ihrer while-Schleife an die falsche Variable sich beziehen, wenn die URL zu erhalten versuchen (und ich denke, Sie sollten den objectForKey: Wähler werden mit einem Wert eines NSDictionary zu bekommen, nicht valueForKey:):

NSEnumerator *browser = [bookmarks keyEnumerator];
id each;
NSURL *url;
while ((each = [browser nextObject])) {
    url = [bookmarks objectForKey:(NSString *)each]; // <-- bookmarks, not browser
    NSLog(@"URL = %@", url);
}

Ich arbeite durch die gleichen Online-Kurse und stellte fest, dass keine der genannten Antworten scheint funktionieren, weil NSEnumerator nicht zu objectForKey reagieren kann oder weil die besondere Art der Aufzählung wird nicht unterstützt (vielleicht nicht im iPhone SDK im Vergleich OSX ich weiß nicht). Ich habe es wie ein Zauber zu arbeiten, als ob folgt ...

NSString *aKey;
NSEnumerator *keyEnumerator = [bookmarks keyEnumerator];
NSURL *url;

while (aKey = [keyEnumerator nextObject])
{
    url = [bookmarks objectForKey:aKey];
    NSLog(@"value: %@", [url absoluteURL]);
}
scroll top