2013-04-18 11 views
23

Ich versuche zu überprüfen, ob eine CGRect ist null in meiner Eigenschaft Getter und wenn ja, einen Wert laden standardmäßig, aber in meiner init-Methode, wenn ich die Eigenschaft verwenden, gibt es Null zurück für alle Werte.Überprüfen Sie, ob CGRect Null in Getter

Hier ist mein Getter:

- (CGRect)frame 
{ 
    if(CGRectIsNull(_frame)) 
     _frame = CGRectMake(0,0,60,60); 
    return _frame; 
} 

- (id)init 
{ 
    self = [super initWithFrame:self.frame]; 
    if(self) 
    { 
     //do something 
    } 
    return self; 
} 

Ich bin nicht sicher, was los ist und wo. Jede Hilfe wird sehr geschätzt.

Antwort

49

Wenn Sie eine Instanz der Klasse erstellen, wird die _frame Instanzvariable automatisch initialisiert, noch bevor die init Methode aufgerufen wird. Da _frame eine C-Struktur (CGRect) ist, wird sein Speicher auf alle Nullen gelöscht. Dies führt zu einem CGRect mit allen Nullwerten.

CGRectNull ist eine spezielle, nicht Null CGRect. So wird Ihre Prüfung mit CGRectIsNull() nie wahr sein.

Mit CGRectIsEmpty ist eine ordnungsgemäße Überprüfung dafür. Hier

+5

'CGRectIsEmpty' ist der bessere Weg, hier zu gehen, aber ich denke, es ist Erwähnenswert ist, dass Sie auch 'CGRectEqualToRect' verwenden und mit' CGRectZero' vergleichen können. –

+1

Wahr, aber 'CGRectIsEmpty (_frame)' ist kürzer als 'CGRectEqualToRect (_frame, CGRectZero)'. – rmaddy

+0

Es ist, und CGRectisEmpty wäre auch meine Vorliebe, nur darauf hinweisend :) –

10

Versuchen

- (CGRect)frame 
{ 
    if (CGRectIsEmpty(_frame)) 
    _frame = CGRectMake(0,0,60,60); 

    return _frame; 
} 
0

ist eine aktualisierte Antwort für Swift 4. Sie können einfach CGRect der isNull boolean Eigenschaft zu überprüfen, für CGRectNull jetzt verwenden:

let someRect = CGRect.null 
print(someRect.isNull) // true