2010-02-05 33 views
7

Tôi sắp gửi ứng dụng iPhone đầu tiên của mình.Bạn có thể gửi nhị phân ứng dụng iPhone với các câu lệnh NSLog không?

Tôi đã đặt rất nhiều câu lệnh NSLog để kiểm tra và gỡ lỗi ứng dụng.

Vì vậy, câu hỏi của tôi là "Is it ok để giữ lại những điều khoản NSLog trong mã nguồn"

và tôi có một nghi ngờ rằng việc các báo cáo NSLog chậm lại tổng thời gian thực hiện hay không.

cảm ơn.

+1

Xem http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use-nslog-on-production-code – Vladimir

Trả lời

9

tôi đã sử dụng tất cả thời gian (tìm thấy nó ở đâu đó):

// DLog is almost a drop-in replacement for NSLog to turn off logging for release build 
// 
// add -DDEBUG to OTHER_CFLAGS in the build user defined settings 
// 
// Usage: 
// 
// DLog(); 
// DLog(@"here"); 
// DLog(@"value: %d", x); 
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead DLog(@"%@", aStringVariable); 
// 

#ifdef DEBUG 
# define DLog(__FORMAT__, ...) NSLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 
#else 
# define DLog(...) do {} while (0) 
#endif 
// ALog always displays output regardless of the DEBUG setting 
#define ALog(__FORMAT__, ...) NSLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 

Dự án three20 từ Facebook có cách phức tạp hơn để gỡ lỗi hoặc khai thác gỗ.

+0

bạn có thể nói nơi bạn đã tìm thấy nó để tôi có thể hiểu rõ hơn về nó – harshalb

+0

Tôi xin lỗi. Tôi quên nó ở đâu. Nhưng, mã nguồn đủ mô tả. Bạn có thể google nó. Nếu tôi có thể tìm thấy nó, bạn có thể. –

+1

Đó là từ blog này - http://iphoneincubator.com/blog/debugging/the-evolution-of-a-replacement-for-nslog – deanWombourne

3

Ba ứng dụng Tôi có trên AppStore được nạp với NSLogs vì vậy tôi đoán nó là okay ...

2

Tôi chưa bao giờ đã thoát khỏi của tôi :)

Một số người đề nghị có điều kiện biên dịch/biên dịch macro vì vậy bạn có thể tạo một bản dựng mà không có bất kỳ NSLog nào nhưng tôi nghĩ đó là quá nhiều nỗ lực cho phần thưởng rất ít.

Tuy nhiên, NSLogs làm chậm ứng dụng xuống (hơi) nên tôi sẽ xóa mọi ứng dụng đang ảnh hưởng trực tiếp đến hiệu suất. Ngoài ra, bạn có thể muốn loại bỏ một số lỗi đăng nhập thông tin để che giấu như thế nào bạn đã thực hiện ứng dụng của bạn, vv

Hy vọng rằng sẽ rất hữu ích,

Sam

+0

Câu trả lời hay nhưng tôi không chắc chắn về "Tôi nghĩ rằng đó là quá nhiều nỗ lực cho phần thưởng rất ít." Một khi bạn đã làm điều này một lần nó không phải là khó thực hiện một lần nữa (mất 5 phút nhiều nhất) khi bạn thiết lập một dự án mới. Cá nhân tôi có một DebugLog được định nghĩa là có điều kiện biên dịch đi không có gì để phát hành xây dựng, để lại cho tôi NSLog để sử dụng cho những thứ thực sự quan trọng mà tôi muốn hiển thị trong các bản ghi. – Kevin

+0

Tùy thuộc vào số lượng và nội dung của NSLogs làm chậm có thể được đáng kể. Nếu bạn đăng nhập mô tả của từng đối tượng trong một bảng, bạn sẽ có khả năng chứng kiến ​​hiệu suất cuộn kém. – FelixLam

+0

@KevinBlair - Rất đúng nhưng tôi phải viết vĩ mô và sau đó nhóm tôi sẽ tất cả cần phải áp dụng vĩ mô - Tôi đang lấy con đường của kháng ít nhất :) (Nó sẽ là tốt đẹp nếu có một macro được xác định trước được tích hợp vào mọi dự án mới) – deanWombourne

6

Ứng dụng tôi đã làm việc trên perviously đã nhiều NSLogs bán phá giá debug vào bảng điều khiển. Chúng tôi thấy rằng họ đã cản trở hiệu suất đáng kể trên iPhone 3G. Hiệu suất đạt được đáng chú ý trên một 3GS, nhưng không nhiều.

Lời khuyên của tôi là sử dụng macro tiền xử lý và định nghĩa tiền xử lý gỡ lỗi để có điều kiện sử dụng NSLogs trong gỡ lỗi bản dựng nhưng không phải trong bản phát hành bản phát hành.

1

Tôi chỉ đơn giản sử dụng bộ int đơn "useDebugMode" được đặt thành 0 hoặc 1 được lưu trữ trong userPrefs (plist). Và, tùy thuộc vào UUID của iphone, tôi thêm một "Sử dụng Debug Mode: on/off" chuyển sang màn hình cài đặt để tôi có thể gỡ lỗi các vấn đề trong tương lai với các phiên bản sản xuất. Điều này cho phép tôi gỡ lỗi các vấn đề về dữ liệu (với XML đã tải xuống) nếu mọi người phàn nàn về các vấn đề với chương trình trong tương lai. sau đó tôi giấu tất cả "NSLog" s và "printf" s trong

if (useDebugLog == 1) 
{ 
    NSLog(@"debug statement"); 
} 

này làm việc cho tôi ... Tất nhiên,:

if (useDebugLog == 1) 

gây một số overhead rằng tôi sẵn sàng đôi pho vơi.

0

Đây không phải là vấn đề khi sử dụng NSLog trong bản phát hành. Nhưng nếu bạn đặt bất kỳ dữ liệu có giá trị nào trong nhật ký người dùng khác (nhà phát triển) có thể thấy dữ liệu đó. Giống như một số liên kết tải xuống, v.v.

2

XCode4 cung cấp giải pháp khá gọn gàng cho điểm ngắt sử dụng này. chọn hành động 'đăng nhập tin nhắn' và đặt val = @ val @ làm thông báo, rồi đánh dấu vào hộp 'tự động tiếp tục sau khi đánh giá hành động'.

Sẽ không phù hợp với mọi trường hợp sử dụng, nhưng nó mang lại cho bạn lợi ích của việc dễ dàng 'kiểm tra' giá trị và đảm bảo chúng sẽ không được đưa vào bản phát hành.

+0

có vẻ tốt. cảm ơn . – harshalb

Các vấn đề liên quan