2011-07-04 36 views
7

Xcode nhìn vào dòng này và không phàn nàn. Dự án được xây dựng, mã bị lỗi khi chạy.Xcode. Câu hỏi về kiểm tra lỗi cú pháp

NSString *randomName = [NSString stringWithFormat:@"%@, %@, %@", 
         [randomAjectiveList objectAtIndex:ajectiveIndex], 
         [randomNounList objectAtIndex:nounIndex]]; 

Đương nhiên, đến để suy nghĩ về nó, tôi có một quá nhiều "%@" tại chỗ, một người nữa thì đối số thực tế. Mã đúng phải giống như sau

NSString *randomName = [NSString stringWithFormat:@"%@, %@", 
         [randomAjectiveList objectAtIndex:ajectiveIndex], 
         [randomNounList objectAtIndex:nounIndex]]; 

Tôi hỏi bạn ... tại sao Xcode không phàn nàn? Có vẻ như một điều rõ ràng như vậy để làm với các quầy param. Điều này có nên được kiểm tra tại thời gian biên dịch không? Có cụ thể là "%@" không?

Vui lòng thông báo.

Trả lời

8

Dựa trên kiểm tra nhanh, bạn đúng 100% rằng điều này không được kiểm tra tại thời gian biên dịch, dường như ngay cả với máy phân tích tĩnh. Ngược lại, NSLog được chọn. Vì vậy, trên máy tính của tôi, với XCode 4.0.2, sau đây:

[NSString stringWithFormat:@"%d %@ %@"]; 
NSLog(@"%d %@ %@"); 

Tạo một cảnh báo trên NSLog của "More '%' chuyển đổi hơn đối số dữ liệu" nhưng thất bại trong việc bình luận về NSString.

Vì vậy, sự khác biệt có thể là cuộc gọi chức năng cố định so với cuộc gọi động. Trình biên dịch không thể thực sự hoàn toàn chắc chắn nơi cuộc gọi NSString sẽ đi bởi vì có thể bạn sẽ khai báo một thể loại hoặc sử dụng thời gian chạy ở mức thấp để điều chỉnh bảng chọn NSString khi chạy.

Tuy nhiên, đặc biệt là các vấn đề bạn sẽ gặp phải ngay lập tức nếu bạn bắt đầu sửa đổi hành vi của các lớp Foundation, như bạn đã mong đợi ít nhất là một cảnh báo.