2012-04-12 9 views
0

Ich habe ein Projekt für iOS 4.x geschrieben. Kürzlich habe ich es mit XCode 4.3.2 auf iOS5 aktualisiert. Es ist seltsam, dass die App jedes Mal mit doppeltem freiem Fehler stoppt, wenn Apple LLVM Compiler verwendet. Nachdem ich zurück zu LLVM GCC gewechselt habe, funktioniert es gut. Gibt es einen Unterschied zwischen diesen beiden? Der Code ist unten dargestellt:Doppelfreier Fehler bei der Verwendung von Apple LLVM Compiler

- (NSArray *)readCourselist { 

    NSString *path = [[self currentUserPathString] stringByAppendingPathComponent:kUserCourseListFilename]; 

    return [NSArray arrayWithContentsOfFile:path]; 

} 

- (NSArray *)getCourselist { 

    NSArray *courseRawArray = [self readCourselist]; 

    for (NSDictionary *courseDic in courseRawArray) { 

     CourseModel *courseModel = [[CourseModel alloc] init]; 

     courseModel.courseID = [[courseDic objectForKey:kKeyID] intValue]; 

     courseModel.courseNameString = [courseDic objectForKey:kKeyTitle]; 

     NSArray *lectureArray = [courseDic objectForKey:kKeyLecture]; 

     for (NSDictionary *lectureDic in lectureArray) { 

      LectureModel *lectureModel = [[LectureModel alloc] init]; 

      NSString *startString = [lectureDic objectForKey:kKeyStart]; 


      if ([startString isEqualToString:@"8:00"]) { 

       lectureModel.lectureNumber = 1; 

      } 

      else if ([startString isEqualToString:@"9:50"]) { 

       lectureModel.lectureNumber = 2; 

      } 



      lectureModel.location = [lectureDic objectForKey:kKeyWhere]; //@property of location is retain 

      [courseModel.lectureArray addObject:lectureModel]; 

      [lectureModel release]; 

     } 

     [courseArray addObject:courseModel]; 

     [courseModel release]; 

    } 

} 

Mit mehr Tracing ich fand heraus, dass es

lectureModel.location = [lectureDic objectForKey:kKeyWhere]; 

die wirklich zählt. In meinem LectureModel wird Standort erklärt als

folgen
@property (nonatomic, retain) NSString *location; 

@synthesize location; 

- (id)init { 
    location = NSLocalizedString(@"未知", nil); 
} 

löschen NSLocalizedString und alles funktioniert gut. Warum?

+4

In welcher Zeile passiert das doppelte frei? – JeremyP

+0

Ich habe keine Ahnung, auf welche Zeile es ankommt. Es stoppt einfach in einem _pthread_kill in xcode, und wenn ich diese Codes auskommentiere, funktioniert es. –

Antwort

0

Im Allgemeinen mit NSDictionary arbeiten möchten Sie valueForKey: anstelle von objectForKey: verwenden, aber ich denke nicht, dass das das Problem hier ist. Wenn du es zurück zu LLVM drehst und Instrumente mit "Zombies" spielst, sollte es dir genau zeigen wo jeder freie (gut, Release) auftritt.

+2

Ich stimme nicht mit dem Rat zu verwenden '-valueForKey:'. '-objectForKey:' ist die native Schnittstelle von 'NSDictionary'. '-valueForKey:' ist ein KVC-Zusatz. Es hat sowohl zusätzliche Funktionalität, die man nicht haben möchte, als auch zusätzliche Einschränkungen, wie beispielsweise, dass der Schlüssel eine Zeichenkette sein muss. –

+0

Ken, ich stehe korrigiert. Du hast da absolut Recht. Ich hätte meine ursprüngliche Antwort abgelehnt, aber man kann nicht für die eigenen Antworten stimmen. Ich stehe jedoch zur Zombie-Anweisung. –

+0

Oh, ich stimme definitiv dem Vorschlag zu, das Zombies-Instrument zu verwenden, um Speicherverwaltungsfehler zu verfolgen. :) –