2012-09-25 17 views
7

Kod nie powinny mieć żadnego wpływu powinno być wykonalne nigdzie nie generuje ostrzeżenie kompilatoraCzy istnieje jakiś żadna operacja op w Objective-C, które możemy użyć tylko ustawić punkt przerwania

Zasadniczo czasami chcę zrobić NSAssert. Jednak zamiast NSAssert, czasami chcę zrobić moje, jeśli siebie}. W ten sposób mogę po prostu ustawić lub wyzerować punkt przerwania.

Obecnie to właśnie robię.

if ([email protected]"Business") 
{ 
    error=nil; //Some code for breakpoint. I want something that do nothing actually. 
} 

Po prostu mam zmienną o nazwie error, której już nie będę używać. Ale co by było dobrym rozwiązaniem? Próbowałem też [nie donieść]; ale to dostało błąd kompilatora.

Odpowiedz

7

Spróbuj:

while (false); 

Istnieją inne możliwości, takie jak if (false) lub nawet linia z pojedynczym średnikiem ;, ale w tych przypadkach wykonanie zatrzymuje się na następnej instrukcji, prawdopodobnie dlatego, że kompilator po prostu eliminuje te puste fragmenty kodu. Korzystanie z while ma tę zaletę, że wykonanie zatrzyma się na tej linii (zakładając oczywiście, że umieściłeś tam punkt przerwania).

+0

wszystkie są świetną odpowiedzią. Ten jest najlepszy. –

+0

"jeśli (fałsz)' i ';' będą działały poprawnie, jeśli nie używamy optymalizacji? –

+1

@ BenC.R.Leggiero Nie mogę powiedzieć na pewno, ale wypróbowanie tego nie potrwa długo. – Caleb

2

Nie porównuj bezpośrednio dwóch ciągów; spróbuj [NSString isEqualToString:]

3

Możesz podać warunki punktów przerwania, przytrzymać opcję i polecenie i kliknąć punkt przerwania, powinieneś otrzymać wyskakujące okienko. W „stan” pola yo może wprowadzić coś takiego

[entityName isEqualToString:@"Business"] 

(zauważ, że należy porównać ciągi z -isEqualToString: nie ==, jak ten ostatni porównuje wskaźniki nie znaki w samych strunach.)

By używając warunku w punkcie przerwania, nie powinieneś w ogóle potrzebować instrukcji if, a także włączać i wyłączać sprawdzanie bez ponownej kompilacji. Jest dużo więcej można zrobić z punktu przerwania ustawień, podobnie jak ma to automatycznie zalogować wiadomość lub uruchomić polecenie debuggera itp

+0

Chcę rzeczy, które wyraźnie widzę w kodzie. –

+0

Osobiście uważam, że posiadanie dużej liczby warunków debugowania w moim kodzie jest bolesne, ponieważ szybko tracisz kontrolę nad tym, gdzie oni wszyscy są, a następnie musicie wytropić je do produkcji lub po prostu wyśledzić inny błąd.Wprowadzanie wszystkich kroków debugowania, takich jak łamanie, rejestrowanie, powiadamianie o nieprawidłowym stanie kodu itp. Znajduję się o wiele wygodniej, jeśli chodzi o punkty przerwania kodu xcode. Wtedy mogę uzyskać dostęp do ich listy, włączać je i wyłączać, i nie są one zobowiązane do kontroli źródła, chyba że wyraźnie się do. Ale każdy ma własny sposób kodowania i powinieneś zdecydowanie użyć tego, co uważasz za najlepsze dla ciebie. –

+0

Właściwie to, co też ma sens. Po prostu powtórz warunek. Hmm ... Kontrola źródła. Muszę się nauczyć, jak z niego korzystać. –

0

można użyć __asm int 3;

if ([entityName isEqualToString:@"Business"]) { 
    __asm int 3; 
} 

Od CFInternal.h.

#if defined(__ppc__) || defined(__ppc64__) 
#define HALT asm __volatile__("trap") 
#elif defined(__i386__) || defined(__x86_64__) 
#if defined(__GNUC__) 
#define HALT asm __volatile__("int3") 
#elif defined(_MSC_VER) 
#define HALT __asm int 3; 
#else 
#error Compiler not supported 
#endif 
#endif 
if ([entityName isEqualToString:@"Business"]) { 
    HALT; 
} 
+0

Co robi __asm ​​int 3? nie op? Jeśli po prostu się zatrzyma, chcę, żeby to się stało przez punkt krytyczny. –

+1

Wywołuje przerwanie przerwania. –

3

W C, można mieć instrukcja no-op prostu umieszczając średnik sama w linii:

if (TRUE) { 
    ; // Neutral operation 
} 

w Objective-C można zrobić to samo, jest to, przystanków programowe przed następnym wierszu, jak widać tutaj:

enter image description here

+0

Doskonała wskazówka. Chcę wstawić taką linię z komentarzem, aby kod sam się dokumentował, że "Brak kodu w tym miejscu.". –

Powiązane problemy