10 Stimmen

IOS 4.3 UINavigationBar tintColor Leaks

Wenn ich in IOS4.3 die

navigationBar.tintColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1];

Ich werde ein Speicherleck bekommen: UIDeviceRGBColor-Leck

Aber wenn ich die navigationBar.tintColor = [UIColor blackColor]; Alles ist in Ordnung.

Dies ist in ios4.2 nie passiert.

Ich habe einige Fehlersuchen durchgeführt und die [navigationBar.tintColor retainCount] größer erscheint, wenn ich die

[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1];

Hat jemand das gleiche Problem?

Dies ist der Leck-Code:
In RootViewController:

- (void)viewWillAppear:(BOOL)animated { 
        self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0];
        [super viewWillAppear:animated];
    } 

In DetailViewController:

- (void)viewWillAppear:(BOOL)animated {
        self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0.9 green:0 blue:0 alpha:0];
        [super viewWillAppear:animated];
    } 

Wenn Sie zum DetailViewController gehen und dann zum RootViewController zurückkehren, können Sie in den Instrumenten das UIDeviceRGBColor-Leck sehen

3voto

Dev2rights Punkte 3449

Ive hatte dieses Problem vor 4.2, ich denke colourWithRed:Green:blue weist ein neues UIColor-Objekt, das Sie für die Verwaltung verantwortlich.

Die Lösung ist, eine Instanz für Ihre Farbtonfarbe zu erstellen und sie freizugeben, wenn Sie mit Ihrem Navigationscontroller in viewDidUnload fertig sind.

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    tintBarColor = [UIColor   
                colorWithRed:50.0/255   
                green:134.0/255   
                blue:187.0/255   
                alpha:1];
    self.navigationController.navigationBar.tintColor = tintBarColor;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    [tintBarColor release];
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on     demand.
    // For example: self.myOutlet = nil;
}

2voto

dnorcott Punkte 357

Ich sehe auch das gleiche Problem. Ich habe einen Fehler bei Apple gemeldet und werde alle Updates posten, sobald ich sie höre.

Ich habe jedoch eine Abhilfe gefunden. Das Problem liegt im Aufruf von self.navigationController.navigationBar.tintColor. Aber wenn Sie die Farbe für eine verschiedene UIViewController werden Sie nicht das gleiche Problem haben. Zum Beispiel, dies scheint nicht zu lecken:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithStyle:UITableViewStyleGrouped];
    detailViewController.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1];
    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
}

Leider hilft das denjenigen von uns, die das Three20-Framework verwenden, nicht =(

UPDATE: Ich habe eine Antwort von Apple erhalten. Sie sagten, dass es bereits gemeldet wurde und sie das Problem untersuchen.

1voto

bbum Punkte 161596

Erstens: Verwenden Sie nicht retainCount . Es ist nutzlos.

Woher wissen Sie dann, dass Sie ein Leck haben? Haben Sie Instrumente benutzt? Und schließlich: Haben Sie die Verfolgung von Einbehaltungsereignissen im Zuweisungsinstrument aktiviert und sehen Sie, wohin alle Einbehaltungen/Freigaben gesendet werden?


+blackColor ist ein Singleton. Daher ist es wahrscheinlich, dass Sie es auch durchsickern lassen, aber es gibt nur ein Exemplar und Leaks werden es nicht finden, da es von einem Global referenziert wird.

Was Ihr Leck betrifft, so spielt es keine Rolle, ob es nur in iOS 4.3 oder 4.2 auftritt. Ein Leck ist ein Leck. Es besteht zwar die Möglichkeit, dass es in den Apple-Frameworks liegt, aber das ist unwahrscheinlich. Wenn dies jedoch der Fall ist, ist ein Fehlerbericht sehr willkommen.

Verwenden Sie auch das Instrument "Zuweisungen", um festzustellen, ob Sie andere Objekte ansammeln, die nicht als Lecks angezeigt werden (aber trotzdem nicht vorhanden sein sollten). Leaks erkennt nur nicht referenzierbare Objekte, aber es gibt viele andere Möglichkeiten, Speicher zu verlieren!

0voto

Moshe Punkte 56647

Versuchen Sie, Build and Analyze (oder Analyze in Xcode 4) zu verwenden und stellen Sie sicher, dass Sie nicht zuerst an anderer Stelle ein Leck haben). Wenn das Problem weiterhin auftritt, reichen Sie einen Fehlerbericht bei Apple ein.

0voto

user609906 Punkte 190

Ich kann das gleiche Leck in meinem Code bestätigen - kein Leck in 4.2 gemeldet und Leck erscheint in 4.3

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