2012-03-16 25 views
39

tôi không thể tìm ra lý do tại sao tôi nhận đượclỗi Weird NSAssert

use of undeclared identifier _cmd did you mean rcmd 

trên dòng nơi NSAssert là.

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) 
{ 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    int x = 10; 

    NSAssert(x > 11, @"x should be greater than %d", x); 

    [pool drain]; 
    return 0; 
} 

Trả lời

95

Bên trong mỗi phương pháp Objective-C có hai biến ẩn id selfSEL _cmd

nên

- (void)foo:(id)bar; 

thực sự là

void foo(id self, SEL _cmd, id bar) { ... } 

và khi bạn gọi

[someObject foo:@"hello world"] 

nó thực sự

foo(someObject, @selector(foo), @"hello world") 

Nếu bạn cmd-click vào NSAssert để chuyển đến định nghĩa của nó, bạn sẽ thấy rằng nó là một macro có sử dụng các biến ẩn _cmd của phương pháp bạn đang gọi nó từ. Điều này có nghĩa là nếu bạn không ở trong một phương thức Objective-c (có lẽ bạn đang ở trong 'main'), do đó bạn không có đối số _cmd, bạn không thể sử dụng NSAssert.

Thay vào đó bạn có thể sử dụng NSCAssert thay thế.

+0

Giải thích thực sự tốt ... và tôi đã học được điều gì đó về mục tiêu-C! – Robert

+0

+1 cho NSCAssert – onmyway133

0

Bạn phải quấn chuỗi trong lớp NSString nếu bạn muốn sử dụng thông số định dạng. Đó là bởi vì @"" là một hàm tạo mặc định cho một NSString đơn giản. Cách nó được viết bây giờ đưa ra một tham số thứ ba cho hàm NSAssert và gây rối với nó.

NSAssert(x > 11, [NSString stringWithFormat:@"x should be greater than %d", x]); 
+0

Tôi gặp lỗi tương tự Nếu tôi thay đổi mã thành NSAssert (x> 11, @ "x phải lớn hơn"); – foho

+0

Câu trả lời từ @highlycaffeinated là câu trả lời tôi đã đạt được ngay bây giờ. – Alexander

1

Cố gắng thay thế

NSAssert (x> 11, [NSString stringWithFormat: @ "x phải lớn hơn% d", x]);

với

NSCAssert (x> 11, [NSString stringWithFormat: @ "x phải lớn hơn% d", x]);