2010-11-04 22 views
6

Oczywiście, z obj-c, zazwyczaj nie ma powodu do pisania programów pobierających i ustawiających (dzięki użytecznemu).Zapisywanie i ustawianie zmiennej BOOL

Więc teraz, potrzebuję zrobić właśnie to, natknąłem się na problem, że nie wiem jak je napisać. : p

Jestem pewna, że ​​prawdopodobnie nie zamierzam rozwiązać mojego problemu we właściwy sposób - łatwiej byłoby po prostu podklasować mój obiekt i takie - ale próbuję napisać kod kategorii, aby dodać właściwości, ponieważ (na początku) było szybsze, a ponieważ chciałem nauczyć się używać kodu kategorii w mojej aplikacji.

mam to:

-(BOOL)isMethodStep { 
    return self.isMethodStep; 
} 

-(void)setIsMethodStep:(BOOL)theBoolean { 
    if(self.isMethodStep != theBoolean){ 
     self.isMethodStep = theBoolean; 
    } 
} 

i próbowałem go bez if zapytania w setter, ale nie wydają się działać. Ładowanie z punktami przerwania pokazuje, że z jakiegoś powodu utknął w ciągłej pętli w metodzie getter.

Czy ten kod jest prawidłowy, czy też robię coś nie tak?

Dzięki Tom

Odpowiedz

11

W

-(BOOL)isMethodStep { 
    return self.isMethodStep; 
} 

return self.isMethodStep; nazywa tą samą metodą isMethodStep powodującą nieskończoną pętlę. To samo dotyczy setera.

Wystarczy użyć Ivars bezpośrednio w implementacji metod dostępowych:

-(BOOL)isMethodStep { 
    return isMethodStep; 
} 

-(void)setIsMethodStep:(BOOL)theBoolean { 
    if(isMethodStep != theBoolean){ 
     isMethodStep = theBoolean; 
    } 
} 
+0

Tak, pomyślałem. :), ale jak mogę temu zapobiec? Jak je napisać? –

+0

- (BOOL) isMethodStep { return isMethodStep; } – superfell

+0

Edytowałem swoją odpowiedź, przypuszczam, że metody powinny wyglądać właśnie tak (jeśli nie zależy Ci na atomowości, nie jestem dobry w rozwiązywaniu problemów ...) – Vladimir

3

Nie chcesz użyć składni self. nieruchomości w obrębie Ustawiacz/getter, bo to wywołuje setter/getter ponownie, zamiast bezpośrednio przypisując do zmiennej.

trzeba po prostu powiedzieć:

-(BOOL)isMethodStep { 
    return isMethodStep; 
} 

-(void)setIsMethodStep:(BOOL)theBoolean { 
    isMethodStep = theBoolean; 
} 

(zakładając "isMethodStep" to nazwa zmiennej). Pominęłbym również test w metodzie Settera ...

+1

Dostaję, że 'isMethodStep jest niezadeklarowany'. :/ –

+0

ten sam problem. Wpisz '_isMethodStep' – WebOrCode

Powiązane problemy