2013-04-18 23 views
23

Sto cercando di verificare se un CGRect è null nel mio getter proprietà e se lo è, caricare un valore per impostazione predefinita, tuttavia, nel mio metodo init, quando uso la proprietà, restituisce zero per tutti i valori.Controllare se CGRect null in getter

Qui è la mia 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; 
} 

Non sono sicuro di quello che sta succedendo e dove cercare. Ogni aiuto è molto apprezzato.

risposta

49

Quando si crea un'istanza della classe, la variabile _frame istanza viene inizializzata automaticamente, anche prima che il metodo init viene chiamato. Poiché _frame è una C-struct (CGRect), la sua memoria viene cancellata a tutti gli zeri. Il risultato è un CGRect con tutti i valori zero.

CGRectNull è uno speciale, non zero CGRect. Quindi il tuo assegno usando CGRectIsNull() non sarà mai vero.

Utilizzare CGRectIsEmpty è un controllo più corretto per questo.

+5

'CGRectIsEmpty' è il modo migliore per andare qui, ma penso che sia vale la pena menzionare che si potrebbe anche usare 'CGRectEqualToRect' e confrontare con' CGRectZero' –

+1

True ma l'uso di 'CGRectIsEmpty (_frame)' è più corto di 'CGRectEqualToRect (_frame, CGRectZero)'. – rmaddy

+0

Lo è, e CGRectIsEmpty sarebbe anche la mia preferenza, solo indicandolo :) –

10

Prova

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

    return _frame; 
} 
0

Qui è una risposta aggiornata per Swift 4. Siete in grado di utilizzare semplicemente isNull proprietà booleana di CGRect per verificare la presenza di CGRectNull ora:

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