2010-05-31 23 views
6

tôi nhận được cảnh báo "Format không phải là một chuỗi chữ và không có đối số định dạng" trên NSLog cuộc gọi trong khối sau:Tôi nhận được cảnh báo "Định dạng không phải là một chuỗi chữ và không có đối số định dạng" tại NSLog - làm thế nào tôi có thể sửa lỗi này trong mã được cung cấp?

- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    NSLog([NSString stringWithFormat:@"%d", buttonIndex]); 
} 

Tôi đã đọc trong bài khác ở đây là thông báo lỗi này cho thấy việc sử dụng không an toàn của NSLog . Ai đó có thể chỉ cho tôi theo hướng của một chuỗi được định dạng đúng cho điều này?

Trả lời

11

Đây là một cảnh báo không hợp lệ trong trường hợp của bạn, nhưng nó cho bạn biết chuỗi định dạng của bạn cho NSLog không được mã hóa cứng và có thể là vấn đề bảo mật/ổn định. Bản sửa lỗi rất đơn giản:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    NSLog(@"%d", buttonIndex); 
} 

Trong trường hợp bạn tò mò, ý tôi là vấn đề an ninh/ổn định là gì. Trong ví dụ của tôi, chuỗi định dạng cho NSLog là hằng số: @"%d" và bạn biết khi nào bạn biên dịch nó NSLog sẽ mong đợi một số nguyên duy nhất được chuyển. Khi bạn gọi NSLog như NSLog([obj makeSomeString]), bạn không thực sự biết tại thời gian biên dịch chuỗi định dạng là gì hoặc có bao nhiêu loại đối số nào cần theo dõi. Nếu tại thời gian chạy, chuỗi này trở thành "%d %d %@", nó sẽ đọc một cách hạnh phúc hai số nguyên và một NSObject từ ngăn xếp, bất kể có bất kỳ đối tượng nào thực sự được đặt ở đó hay không. Đó là vấn đề mà nó cảnh báo bạn.

Cảnh báo không hợp lệ trong trường hợp của bạn vì chuỗi bạn đang tạo có định dạng% d, vì vậy nó không được bao gồm ký tự % khiến sự cố này hiển thị.

+0

tốt, "về mặt kỹ thuật", cảnh báo thực sự hợp lệ! Là một ngôn ngữ động, có thể thay đổi việc thực hiện 'stringWithFormat:' khi chạy, vì vậy tất cả các vấn đề bạn đã đề cập vẫn có thể xảy ra. Ngoài ra, bạn có thể thay đổi đối tượng chuỗi thành một đối tượng có vấn đề, có thể do nhầm lẫn, nhưng trình biên dịch không thể kiểm tra điều đó; do đó cảnh báo. – mohsenr

+0

Hm, đúng vậy! Về mặt kỹ thuật. : D – alltom

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