2010-07-24 22 views

Odpowiedz

7

Aby rozwinąć na @Anders komentarzu, specyficzny problem to chroni Cię przed idzie tak:

if (foo = x) { do_something() }; 

90% czasu to jest błąd. Miałeś zamiar powiedzieć: foo == x. Ale w 10% przypadków naprawdę chodziło o "przypisać x do foo, a następnie sprawdzić prawdę". Kanonicznym przykładem tego jest while (ch = getchar()). Ale if (self = [super init]) to kolejny dobry przykład. Kompilator zakłada, że ​​takie rzeczy są błędami i generuje ostrzeżenie, chyba że powiesz kompilatorowi, że naprawdę to zrobiłeś, używając podwójnych nawiasów.

Osobiście po prostu zrobić to w ten sposób:

self = [super init]; 
if (self != nil) 
{ 
    ... 
} 
return self; 

To dodatkowa linia, ale utrzymuje, że rzeczy po prostu odrobinę jaśniejsze, gdy połączenie init jest długa.

Astronauta, Aaron Hillegass ze sławą Big Nerd Ranch zakwestionował wielu z nas, aby wymyślić jakikolwiek przypadek, w którym to faktycznie miało znaczenie to sprawdzanie self==nil. Przypadki istnieją, ale są niewiarygodnie rzadkie (możesz dodać self jako obserwatora i nie chcesz, aby był w tym przypadku nil). Weź to, co jest warte; w moim osobistym kodzie często pomijam test nil, ale w moim profesjonalnym kodzie jest to część standardu mojego zespołu.

Z drugiej strony, z jakiegoś powodu Apple dodał dodatkową opcję gcc -Wmost, która wyłączy to ostrzeżenie. Sądzę, że ktoś nie lubił pisać dodatkowych nawiasów. Nie wydaje mi się, żeby go wyłączyć.

2

to tylko po to, aby uniknąć ostrzeżenia.

+0

i na szczęście (nowoczesne) kompilatory wydają ostrzeżenia. wiele błędów można wprowadzić przez przypadkowe użycie przydziału kontra równości w wyrażeniu warunkowym - nie należy ich ignorować w sposób trywialny. –

+0

Tak, w objc, gdy pojawi się ostrzeżenie, może to być coś naprawdę poważnego, więc pozbycie się tych błahych ułatwia wykrycie tych paskudnych. –