2010-09-03 11 views
21

Was bedeutet das? Ich erhalte diesen Fehler, wenn ich versuche, eine Datei in Cocoa obj-c zu durchlaufen.Warnung: Versuch, die Variable USE_BLOCK_IN_FRAME mit einem Block zu erstellen, der sich nicht im Rahmen befindet

Ich kann keine Informationen im Internet finden.

Würde mich über Hilfe freuen. Vielen Dank.

EDIT

ich nach diesem Tutorial habe (link) Core Data vorzuladen. Ich habe versucht, eine Cococa-Anwendung zu erstellen und habe es auch aus meiner iPhone-App heraus versucht. Ich denke, dass mein Setup-Code für Core Data in Ordnung ist. Wann immer diese Methode aufgerufen wird, bekomme ich EXEC BAD ACCESS.

- (void)loadInitialData 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    // name ZSTREET_1 ZSTREET_2 ZCITY ZZIP ZURL ZTEL latitude longitude 

    NSString *path = [[NSBundle mainBundle] pathForResource:@"placesdata" ofType:@"txt"]; 

    NSString *fileString = [NSString stringWithContentsOfFile:path]; // reads file into memory as an NSString 
    NSArray *lines = [fileString componentsSeparatedByString:@"\r"]; // each line, adjust character for line endings 
    NSManagedObjectContext *context = [self managedObjectContext]; 
    for (NSString *line in lines) 

    { 
     NSLog(line); 

     NSString* string = [[NSString alloc] initWithUTF8String:line]; 
     NSArray *parts = [string componentsSeparatedByString:@"\t"]; 
     // value mapping 
     NSString *name = [parts objectAtIndex:0]; 
     NSString *street_1 = [parts objectAtIndex:1]; 
     NSString *street_2 = [parts objectAtIndex:2]; 
     NSString *city = [parts objectAtIndex:3]; 
     NSString *zip = [parts objectAtIndex:4]; 
     NSString *url = [parts objectAtIndex:5]; 

     NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; 
     [f setNumberStyle:NSNumberFormatterDecimalStyle]; 

     NSNumber *latitude = [f numberFromString:[parts objectAtIndex:6]]; 
     NSNumber *longitude = [f numberFromString:[parts objectAtIndex:7]]; 
     [f release]; 
     // splitting the parts to create the objects 

     Place *place = (Place *)[NSEntityDescription insertNewObjectForEntityForName:@"Place" inManagedObjectContext:context]; 
     Address *address = (Address *)[NSEntityDescription insertNewObjectForEntityForName:@"Address" inManagedObjectContext:context]; 
     Location *location = (Location *)[NSEntityDescription insertNewObjectForEntityForName:@"Location" inManagedObjectContext:context]; 

     // set attributes 
     [place setValue:name forKey:@"name"]; 
     [address setValue:street_1 forKey:@"street_1"]; 
     [address setValue:street_2 forKey:@"street_2"]; 
     [address setValue:city forKey:@"city"]; 
     [address setValue:zip forKey:"@zip"]; 
     [address setValue:url forKey:@"url"]; 
     [location setValue:latitude forKey:@"latitude"]; 
     [location setValue:longitude forKey:@"longitude"]; 

     // link the objects together 
     [place setValue:address forKey:@"address"]; 
     [place setValue:location forKeyPath:@"address.location"]; 

     [string release]; 
    } 
    NSLog(@"Done initial load"); 
    NSError *error; 
    if (![context save:&error]) { 
     NSLog(@"Error saving: %@", error); 
    } 
    [context release]; 
    [pool drain]; 


} 
+1

Bitte einen Code zeigen. – zneak

+0

Kakao oder Kakao Touch? Ich bemerke, dass du die Frage als [iphone] getaggt hast. –

Antwort

3

Diese Linie ist falsch und sollte eine Warnung erzeugen Compiler:

NSString* string = [[NSString alloc] initWithUTF8String:line]; 

Verfahren initWithUTF8String: eine Zeichenfolge UTF-8 codiert C erwartet und nicht ein NSString Objekt.

Bevor Sie fortfahren, sollten Sie alle Compiler-Warnungen beheben! Und Sie sollten auch überprüfen, ob das Array parts tatsächlich so viele Objekte enthält, wie Sie erwarten. Sie müssen auch eine Formatzeichenfolge mit NSLog verwenden, Sie könnten sogar dort abstürzen, wenn Ihre Zeile % Zeichen enthält.

+0

apski: Wenn Sie bereits ein NSString-Objekt haben, müssen Sie darüber hinaus kein NSString-Objekt erstellen. –

+0

Danke allen! Es war in der Tat die Zeilencodierung, die das Problem verursachte. – apski

+38

Das ist großartig für sein Problem, aber was bedeutet der Fehler ?!Das heißt, ich habe die gleiche Fehlermeldung in komplett anderem Code. Wie zu debuggen? (Keine Compilerwarnungen oder analysieren Warnungen, und ich bin ein erfahrener iOS-Entwickler. Ich habe gerade dieses vorher nicht gesehen.) Danke! – Olie

4

Für jemanden, der über diese in die Zukunft kommt, habe ich dieses Problem, weil ich das zu viel tat:

NSString* aString = @""; 

for(int i=0; i<someLargeNumber; i++) { 
    aString = [aString stringByAppendingFormat:@"..."]; 
} 

Sobald ich mit NSMutableString geschaltet wurde das Problem behoben.

29

Für andere Leute, die auf dieses Problem mit völlig anderem Code stoßen, ist das ein bisschen wie ein Ablenkungsmanöver.

Die Warnung stammt vom Debugger selbst. Der Debugger erstellt eine Struktur mit Informationen für jedes Objekt im System. Nach dem EXC_BAD_ACCESS versuchte es, eines von diesen zu erstellen, konnte es aber nicht. Beachten Sie, dass dies eine Warnung und kein Fehler ist, so dass es sogar in Situationen wie diesem erwartet werden kann.

In jedem Fall spielen die Details keine Rolle. Sie müssen die Quelle Ihres EXC_BAD_ACCESS finden. Eine häufige Ursache ist der Versuch, auf ein Objekt zuzugreifen, nachdem es freigegeben wurde.

0

Ich zufällig zu EXC_BAD_ACCESS auf einer ziemlich regelmäßigen Basis (was ist nicht eine gute Sache), weil wir ARC noch nicht aktiviert haben.

Ich finde den besten Weg, diese Fehler zu verfolgen, indem Sie den Profiler im Zombie-Modus verwenden. Dieser Beitrag zeigt Ihnen, wie man "für Zombies Jagd":

How do I set up NSZombieEnabled in Xcode 4?

Verwandte Themen