2013-04-18 12 views
23

Próbuję sprawdzić, czy CGRect jest null w moim getter właściwości, a jeśli jest, załaduj wartość domyślnie, jednak w mojej metody init, gdy używam właściwości, zwraca zero dla wszystkich wartości.Sprawdź, czy CGRect null w getter

Oto moja rodzicielka:

- (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; 
} 

Nie jestem pewien, co się dzieje i gdzie szukać. Każda pomoc jest doceniana.

Odpowiedz

49

Po utworzeniu instancji klasy, zmienna _frame instancja jest inicjowany automatycznie, nawet zanim metoda init nazywa. Ponieważ _frame jest strukturą C (CGRect), jej pamięć jest usuwana do wszystkich zer. Powoduje to, że CGRect ma wszystkie wartości zerowe.

CGRectNull jest specjalnym, niezerowym CGRect. Więc twoja kontrola z użyciem CGRectIsNull() nigdy nie będzie prawdą.

Stosowanie jest lepszym rozwiązaniem.

+5

'CGRectIsEmpty' jest lepszy sposób, aby iść tutaj, ale myślę, że to warto wspomnieć, że można również użyć 'CGRectEqualToRect' i porównać z' CGRectZero' –

+1

True, ale użycie 'CGRectIsEmpty (_frame)' jest krótsze niż 'CGRectEqualToRect (_frame, CGRectZero)'. – rmaddy

+0

To jest i CGRectIsEmpty również byłby moją preferencją, po prostu wskazując to :) –

10

Spróbuj

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

    return _frame; 
} 
0

Oto uaktualniony odpowiedź na Swift 4. Jesteś w stanie po prostu użyć isNull właściwości Boolean CGRect do sprawdzenia CGRectNull teraz:

let someRect = CGRect.null 
print(someRect.isNull) // true 
Powiązane problemy