2012-09-25 35 views
7

Mã này không nên có bất kỳ tác Nó nên được doable bất cứ nơi nào Nó không tạo ra trình biên dịch cảnh báoCó một số không hoạt động op trong Objective-C mà chúng ta có thể sử dụng chỉ để đặt breakpoint

Về cơ bản đôi khi tôi muốn làm NSAssert. Tuy nhiên, thay vì NSAssert, đôi khi tôi muốn làm điều đó nếu tôi tự làm. Bằng cách đó, tôi có thể dễ dàng đặt hoặc bỏ đặt điểm ngắt

Hiện tại đây là những gì tôi làm.

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

Chỉ xảy ra khi tôi có biến có tên là lỗi mà tôi sẽ không còn sử dụng nữa. Nhưng điều gì sẽ là một sự thay đổi tốt đẹp

Tôi cũng đã thử [nil donothing]; nhưng có lỗi biên dịch.

Trả lời

7

Hãy thử điều này:

while (false); 

Có những khả năng khác, như if (false) hoặc thậm chí chỉ là một dòng với dấu chấm phẩy đơn lẻ ;, nhưng trong những trường hợp đó, lệnh dừng lại ở lệnh tiếp theo, có thể vì trình biên dịch đơn giản loại bỏ các bit mã trống đó. Sử dụng while có lợi thế là việc thực hiện sẽ dừng trên dòng đó (giả sử bạn đặt một điểm ngắt ở đó, tất nhiên).

+0

tất cả đều là câu trả lời tuyệt vời. Điều này là tốt nhất. –

+0

sẽ 'if (false)' và ';' hoạt động tốt nếu chúng ta không sử dụng tối ưu hóa? –

+1

@ BenC.R.Leggiero Tôi không thể nói chắc chắn, nhưng sẽ không mất nhiều thời gian để thử nó. – Caleb

2

bạn không so sánh trực tiếp 2 chuỗi; thử [NSString isEqualToString:]

3

Bạn có thể cung cấp các điều kiện điểm ngắt, giữ tùy chọn và lệnh và nhấp vào điểm ngắt, bạn sẽ nhận được một cửa sổ bật lên. Trong trường 'tình trạng' yo có thể nhập cái gì đó như

[entityName isEqualToString:@"Business"] 

(Lưu ý rằng bạn nên so sánh chuỗi với -isEqualToString: không ==, vì sau đó so sánh các con trỏ không phải là nhân vật trong chuỗi tự.)

Bằng bằng cách sử dụng điều kiện trong breakpoint bạn không nên cần câu lệnh if ở tất cả, và cũng có thể kích hoạt và vô hiệu hóa việc kiểm tra mà không cần biên dịch lại. Có rất nhiều bạn có thể làm với các thiết lập breakpoint, giống như có nó tự động đăng nhập một tin nhắn hoặc chạy một lệnh debugger, vv

+0

Tôi muốn những thứ tôi có thể thấy rõ trong mã. –

+0

Cá nhân tôi thấy có rất nhiều điều kiện gỡ lỗi trong mã của tôi là một nỗi đau, vì bạn nhanh chóng mất dấu vị trí của tất cả chúng và sau đó phải truy tìm chúng để sản xuất hoặc chỉ theo dõi một lỗi khác.Đặt tất cả các bước gỡ lỗi như vi phạm, ghi nhật ký, cảnh báo trạng thái mã không chính xác, v.v. Tôi thấy thuận tiện hơn khi ở trong các điểm ngắt xcode. Sau đó, tôi có thể truy cập vào danh sách của họ, bật và tắt chúng một cách dễ dàng, và họ không được cam kết kiểm soát nguồn trừ khi được thực hiện một cách rõ ràng. Nhưng mọi người đều có cách viết mã riêng và bạn chắc chắn nên sử dụng những gì bạn cảm thấy phù hợp nhất với bạn. –

+0

Thực ra bạn cũng có ý nghĩa gì. Chỉ cần lặp lại điều kiện. Hmm ... Kiểm soát nguồn. Tôi phải học cách sử dụng nó. –

0

bạn có thể sử dụng __asm int 3;

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

Từ 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

__asm ​​int 3 làm gì? không có op? Nếu nó chỉ dừng lại, tôi muốn nó được thực hiện bởi các điểm break. –

+1

Nó sẽ gọi ngắt ngắt. –

3

Trong C, bạn có thể có một hướng dẫn không-op chỉ đơn giản là đặt một dấu chấm phẩy một mình trong một dòng:

if (TRUE) { 
    ; // Neutral operation 
} 

Trong Objective-C bạn có thể làm như vậy, điều này là điểm dừng chương trình của bạn trước dòng tiếp theo, như bạn có thể xem tại đây:

enter image description here

+0

Mẹo tuyệt vời. Tôi muốn chèn một dòng như vậy với chú thích để làm cho mã tự tự viết rằng "Không cần mã vào thời điểm này". –