2011-12-18 27 views
34

Tôi thường thấy "khẳng định" trong mã iOS, tôi google nó, và đã biết nó khẳng định đúng hay sai.Làm cách nào để biết NSAssert có bị tắt trong bản phát hành bản phát hành không?

Tôi muốn biết điều này có tự động tắt trong chế độ phát hành không?

+2

Nó là, thẳng thắn, một thiết kế điên mà khẳng định không bị tắt trong bản phát hành xây dựng theo mặc định. Ruồi khi đối mặt với mọi trình biên dịch C khác mà tôi biết. –

+0

@SevaAlekseyev Đồng ý, chúng tôi đã bị sốc khi Các xác nhận vẫn được đưa ra trong Bản phát hành. Hoàn toàn độc đáo. Triết lý của chúng tôi là 'thất bại nhanh chóng phát triển, chết cứng trong sản xuất'. –

Trả lời

38

Sử dụng NSAssert() và các đồng hành của nó.

trong dự án xác định NS_BLOCK_ASSERTIONS cho cấu hình phát hành của bạn.

Xcode 4 tremplates vô hiệu hóa NSAsserts trong cấu hình phát hành. Nó thêm

-DNS_BLOCK_ASSERTIONS=1 

tới "Cờ C khác" cho "Bản phát hành".

Từ các tài liệu:

Khẳng định bị vô hiệu hóa nếu Preprocessor vĩ mô NS_BLOCK_ASSERTIONS được định nghĩa.

Macro NSAssert đánh giá điều kiện và đóng vai trò như giao diện người dùng cho trình xử lý xác nhận.

Mỗi chuỗi có trình xử lý xác nhận riêng, là đối tượng của lớp NSAssertionHandler. Khi được gọi, một trình xử lý xác nhận sẽ in một thông báo lỗi bao gồm tên phương thức và tên lớp (hoặc tên hàm). Sau đó, nó nêu ra một ngoại lệ NSInternalInconsistencyException. Nếu điều kiện đánh giá là NO, macro sẽ gọi handleFailureInMethod:object:file:lineNumber:description: trên trình xử lý xác nhận cho luồng hiện tại, chuyển desc làm chuỗi mô tả.

Macro này chỉ nên được sử dụng trong các phương pháp Mục tiêu-C.

4

Các lời khẳng định được biên soạn có điều kiện khỏi mã của bạn khi NDEBUG được xác định. Nếu bạn xác định NDEBUG=1 trong phần cài đặt xây dựng tương ứng, bạn sẽ hủy kích hoạt các xác nhận trong mã của mình bất kể chế độ phát hành hoặc gỡ lỗi.

24

Tôi sẽ ở đây cung cấp một meta-câu trả lời:

Cả @CocoaFu và @dasblinkenlight là chính xác. NS_BLOCK_ASSERTIONS tắt NSAssert()NDEBUG tắt assert(). Bạn cần cả hai nếu bạn sử dụng cả hai.

+0

Reading iOS 5 Lập trình bởi @ Rob: Nhận nó, đọc nó, chương trình tốt hơn trong iOS 5. – zaph

+0

Thật không may, trong phần tóm tắt của hai chữ bạn đánh vần một sai. – Ant

+1

Lưu ý và cố định. NSDEBUG-> NDEBUG –

7

Như Zaph đã nói -DNS_BLOCK_ASSERTIONS=1 được đặt để phát hành. Tuy nhiên, nếu bạn muốn kiểm tra điều này.

Quan sát đầu tiên trong tài liệu rằng NSAssert bị vô hiệu hóa bởi macro NS_BLOCK_ASSERTIONS. Sau đó, thêm video này vào việc xây dựng và thực hiện nó tuân ok:

#ifdef NS_BLOCK_ASSERTIONS 
#error Error - NS_BLOCK_ASSERTIONS is defined 
#endif 

Sau đó thay đổi chương trình để phát hành (cmd - thay đổi - <)

enter image description here

sau đó quan sát rằng việc xây dựng thất bại. Do đó NS_BLOCK_ASSERTIONS được định nghĩa nghĩa là NSAssert s bị tắt.

0

Bây giờ, kể từ Xcode 6, cài đặt là ENABLE_NS_ASSERTIONS, được đặt thành 1 cho cấu hình Gỡ lỗi và theo mặc định là 0 cho Bản phát hành.

Bạn có thể chọn tham gia bản phát hành trên dòng lệnh bằng cách chuyển đối số ENABLE_NS_ASSERTIONS=1 mà tôi đang thực hiện để chạy kiểm tra đơn vị kiểm tra điều kiện xác nhận, nhưng nếu không hãy chạy cờ DEBUG.

26

Cập nhật: Đã xác minh điều này cũng hoạt động trong Xcode 8.

Trong Xcode 7, hãy chuyển đến cài đặt xây dựng dự án và tìm kiếm "Xác nhận" trong thanh tìm kiếm. Phần này hiển thị phần "Apple LLVM 7.0 - Preprocessing". Có một thiết lập có tên là "Enable Foundation Assertions".

Tôi đã bật thành công/tắt NSAssert từ đó.

enter image description here

+2

có thêm một 'ENABLE_NS_ASSERTIONS = NO; 'cờ đến' AppName.xcodeproj tập tin/project.pbxproj' của ứng dụng – computingfreak

0

Đây là những gì tôi làm ở phía trên cùng của tôi main():

#if defined(NDEBUG) 
{ 
    // The assertion code below should be compiled out of existence in a release 
    // build. Log an error and abort the program if it is not. 
    bool ok = true; 
    NSCAssert(ok = false, @"NS assertions should be disabled but are not"); 
    if (!ok) 
    { 
    NSLog(@"Detected release build but NS_BLOCK_ASSERTIONS is not defined"); 
    return -1; 
    } 
} 
#endif 

Lưu ý rằng kể từ khi main() là một hàm C và không phải là một chức năng Objective-C, NSCAssert được sử dụng trên hơn NSAssert . (NSAssert mong đợi self là hợp lệ.)

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