2013-08-23 30 views
7

Vì vậy, đây là vấn đề. Tôi sẽ sớm phát hành bản cập nhật cho iOS sẽ giải quyết một số vấn đề trong iOS 7. Để thực hiện việc này, tôi cần sử dụng một số chức năng/loại iOS 7 cụ thể. Tôi đã hoàn toàn chắc chắn rằng mã iOS 7 sẽ chỉ được thực hiện trên iOS 7 và dự phòng với các mã khác nhau cho iOS trước 7. Tất nhiên, tôi không được phép gửi với phiên bản beta Xcode hiện tại, vì vậy tôi đang cố gắng biên dịch với bản phát hành Xcode hiện tại. Tuy nhiên, tôi dường như không thể tìm thấy một cách để vô hiệu hóa cảnh báo đặc biệt này:Điều kiện ẩn mã từ trình biên dịch

Use of undeclared identifier '<Redacted>'.

Có ai biết một cách để vô hiệu hóa cảnh báo này sử dụng một #pragma. Tôi đã thử một bó của những người thân khác nhau bao gồm

-w, -Weverthing, -Wall

nhưng không có vẻ làm việc.

CẬP NHẬT Trả lời: Dĩ nhiên, bạn không thể biên dịch mã nhận dạng mà nó không biết gì cả. giải pháp của tôi là chỉ cần tạo một #define:

#define <redacted> 1

UPDATE 2 Câu trả lời dưới đây thực sự đã làm cho nó dễ dàng hơn nhiều. Tôi đã tạo một #define Xcode5Code(code, alt) cho phép tôi thực thi các khối mã có điều kiện. Bằng cách thay đổi nó bằng cách sử dụng giải pháp của @maddy:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 
    #define Xcode5Code(code, alt) code 
#else 
    #define Xcode5Code(code, alt) alt 
#endif 

này cho phép tôi để dễ dàng ẩn các khối mã từ trình biên dịch bằng cách sử dụng:

Xcode5Code({ 
    //Code to be execute only with Xcode 5 
}, { 
    //code to be executed in previous versions of Xcode 
}) 

Lợi ích chính của việc sử dụng các #define Xcode5Code là Xcode rằng sẽ tự động hoàn thành nó cho bạn, dễ hơn rất nhiều so với việc sử dụng đầy đủ #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000, mà Xcode sẽ không tự động hoàn thành.

Điều này sẽ không thực sự phân biệt giữa các thiết bị iOS 7 và iOS 7 trước. Nó chỉ phân biệt phiên bản iOS mà Xcode hiện tại có thể xử lý. Để phân biệt giữa các phiên bản thiết bị iOS tôi sử dụng:

NSUInteger DeviceSystemMajorVersion(void) { 
    static NSUInteger _deviceSystemMajorVersion = -1; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     _deviceSystemMajorVersion = [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] objectAtIndex:0] intValue]; 
    }); 
    return _deviceSystemMajorVersion; 
} 

Ở trên là mã của Apple, nhân tiện. Để nhảy xung quanh NDA một chút, tôi sẽ nói rằng điều này giúp với việc đặt ra khung nhìn của trình điều khiển gốc, bởi vì điều đó phụ thuộc vào cả phiên bản Xcode bạn đang sử dụng VÀ phiên bản iOS trên thiết bị. Và nếu bạn đang cố gắng quản lý mã beta cũng như mã sản xuất, điều này có thể giúp ích rất nhiều. Sau khi bạn có thể gửi ứng dụng bằng Xcode 5, #define Xcode5Code sẽ không còn cần thiết nữa.

+0

Đó không phải là cảnh báo, đó là lỗi. Làm thế nào để bạn muốn trình biên dịch thao tác một định danh mà nó không biết? – Mat

+0

Đó có phải là cảnh báo không? Trông giống như một lỗi. – trojanfoe

+0

@Mat Ah ... duh, tất nhiên rồi. Rõ ràng hôm nay tôi cần thêm cà phê. Có, đó là một lỗi và tất nhiên tôi không thể mong đợi trình biên dịch để biên dịch một cái gì đó nó không biết gì về. –

Trả lời

22

Nếu bạn muốn biên dịch ứng dụng của bạn với hai phiên bản khác biệt của Xcode hoặc hai thiết lập cơ sở SDK khác nhau thì bạn nên sử dụng trình biên dịch chỉ thị:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 // iOS 7.0 supported 
    // iOS 7 code here 
#else 
    // Pre-iOS 7 code here 
#endif 

Không sử dụng này để kiểm tra thời gian chạy. Giải pháp này chỉ được sử dụng khi bạn phải biên dịch mã của bạn với hai phiên bản khác nhau. Một ví dụ là bạn đã thêm mã iOS 7 nhưng bạn vẫn cần phải biên dịch mã bằng Xcode 4.6. Sử dụng các chỉ thị biên dịch cho phép bạn "ẩn" mã iOS 7 từ trình biên dịch bằng cách sử dụng SDK cơ sở cũ hơn.

Xem "Hướng dẫn tương thích SDK" trong tài liệu để biết thêm về kiểm tra thời gian chạy thích hợp và này.

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