2016-08-11 1 views
1

Ich habe eine einfache Frage: Was ist besser aus irgendeinem Grund - [UIColor somecolor] jedes Mal verwenden, wenn Sie es einstellen oder eine Eigenschaft/ivar und setzen Sie es in ViewDidLoad und dann überall im Controller verwenden?Bessere Verwendung von UIColor

@property (nonatomic, strong) UIColor *someColor; 
someColor = [UIColor redColor]; 

view1.color = someColor; 
view2.color = someColor; 
... 

Warum?

Die Eigenschaft für UIColor ist zu zeitaufwendig und ich denke, dass es für so ein kleines Objekt nicht notwendig ist. Gibt es einen schnellen Weg, um darüber hinwegzukommen, ohne Eigentum zu machen?

Antwort

0

Die Komfortmethoden mit dem Muster "someColor" weisen bei jedem Aufruf Speicher zu. Dies ist weniger effizient, als wenn der Speicher einmal zugewiesen und einer Eigenschaft zugewiesen wird (d. H. Eine Variable, die auf den Teil des zugewiesenen Speichers zeigt).

Im Allgemeinen ist Dereferenzierung viel weniger teuer als Zuteilung.

EDIT: Seit was @Mats erwähnt: Scratch, dass, da die Bequemlichkeit Methoden Singletons zurückgeben, es keinen Unterschied macht.

+4

Nein, sie don t. Sie geben ein Singleton zurück. Versuchen Sie 'NSLog (@"% p% p ", [UIColor RotFarbe], [UIColor RotFarbe]);'. – Mats

+0

Ich hatte keine Ahnung. Danke, dass du darauf hingewiesen hast. Ich habe meine ursprüngliche Antwort bearbeitet. – ff10

+1

@Mats, wenn es ein Singleton ist, als keine anderen Fragen, ist Ihr Kommentar der beste. Bitte posten Sie eine vollständige Antwort und ich werde es überprüfen. –

1

Normalerweise sollten Sie lieber eine Eigenschaft verwenden, die den Zeiger auf ein Objekt hat, dies kann die Leistung Ihrer Anwendung mit großen Objekten verbessern, anstatt eine Methode aufzurufen, um darauf zugreifen zu können. In diesem Fall ist UIColor kein großes Objekt und Sie haben keine großen Vorteile.

Wie auch immer, wenn Sie ein Objekt mehrmals in einer Klasse verwenden, sollten Sie eine Eigenschaft dafür haben.

0

Beste ist:

- (void) changeColor:(UIColor *)color 
{ 
    view1.backgroundColor = color; 
    view2.backgroundColor = color; 
    view3.backgroundColor = color; 
} 

oder wohl:

[@[view1, view2, view3] makeObjectsPerformSelector:@selector(setBackgroundColor:) withObject:[UIColor redColor]]; 

Like this Sie instanziiert das Objekt einmal, wenn Sie die Methode aufrufen, und Sie müssen nicht in einer Eigenschaft zu speichern, da jede Ansicht es bereits speichert. Wenn Sie es in der Zukunft ändern möchten, rufen Sie einfach die Methode erneut, während, wenn Sie eine Eigenschaft, nach dem Gesetz von OOP, Änderung der Eigenschaft würde nicht die Farbe der Ansichten ändern ...