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?
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?
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.
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.
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()
và NDEBUG
tắt assert()
. Bạn cần cả hai nếu bạn sử dụng cả hai.
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 - <)
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.
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
.
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ừ đó.
có thêm một 'ENABLE_NS_ASSERTIONS = NO; 'cờ đến' AppName.xcodeproj tập tin/project.pbxproj' của ứng dụng – computingfreak
Đâ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ệ.)
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. –
@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'. –