Objective - C基础: 第二天 - 3.OC语法之弱语法

来源:互联网 发布:ubuntu挂起唤醒快捷键 编辑:程序博客网 时间:2024/06/05 11:25

之前, 我们学习了C语言, 知道了C语言是一种弱语法, 它没有把一些不规范的写法直接报错, 而是只有一个警告, 我们都知道警告是可以编译成功的, 只有在运行时或者链接时才会报错, 那么在OC里又是怎样呢? 下面让我们来看看~~


C语言例子:

int main(){    asdasd();    return 0;}

编译的结果:

Cain:2.第二天 Cain$ cc -c 3-OC弱语法.m 3-OC弱语法.m:11:5: warning: implicit declaration of function 'asdasd' is invalid in C99      [-Wimplicit-function-declaration]    asdasd();    ^1 warning generated.

链接的结果:

Cain:2.第二天 Cain$ cc 3-OC弱语法.oUndefined symbols for architecture x86_64:  "_asdasd", referenced from:      _main in 3-OC弱语法.old: symbol(s) not found for architecture x86_64clang: error: linker command failed with exit code 1 (use -v to see invocation)

C语言就是这样子的弱语法, 有不合理不规范的语法, 只会报一个警告, 不会有什么作为, 只有在链接的时候才会报错, 那么OC又如何呢?? 下面让我们来看看~~~





OC语言例子:

#import <Foundation/Foundation.h>@interface Student : NSObject@end@implementation Student@endint main(){    Student *stu = [Student new];        [stu abcd];        return 0;}

链接的结果:

Cain:2.第二天 Cain$ cc -c 3-OC弱语法.m3-OC弱语法.m:13:10: warning: instance method '-abcd' not found (return type defaults to 'id')      [-Wobjc-method-access]    [stu abcd];         ^~~~3-OC弱语法.m:3:12: note: receiver is instance of class declared here@interface Student : NSObject           ^1 warning generated.

编译的结果:

Cain:2.第二天 Cain$ cc 3-OC弱语法.o -framework FoundationCain:2.第二天 Cain$ 

运行的结果:

Cain:2.第二天 Cain$ ./a.out 2015-01-16 20:20:07.086 a.out[13226:1438772] -[Student abcd]: unrecognized selector sent to instance 0x7f98b1c0e0602015-01-16 20:20:07.090 a.out[13226:1438772] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Student abcd]: unrecognized selector sent to instance 0x7f98b1c0e060'*** First throw call stack:(0   CoreFoundation                      0x00007fff9587464c __exceptionPreprocess + 1721   libobjc.A.dylib                     0x00007fff9b68b6de objc_exception_throw + 432   CoreFoundation                      0x00007fff958776bd -[NSObject(NSObject) doesNotRecognizeSelector:] + 2053   CoreFoundation                      0x00007fff957bea84 ___forwarding___ + 10284   CoreFoundation                      0x00007fff957be5f8 _CF_forwarding_prep_0 + 1205   a.out                               0x0000000107d31f54 main + 686   libdyld.dylib                       0x00007fff955795c9 start + 17   ???                                 0x0000000000000001 0x0 + 1)libc++abi.dylib: terminating with uncaught exception of type NSExceptionAbort trap: 6

其实OC和C有一些不一样, OC只会在运行的时候才会检测语法是否有错误, 如果一旦有错误, 才会报错, 否则就会继续运行.


那么这个报错是什么意思呢? 其实在这里那么多信息, 我们只要找到一句就可以了:

2015-01-16 20:20:07.086 a.out[13226:1438772] -[Student abcd]: unrecognized selector sent to instance 0x7f98b1c0e060

意思是: 你所发送给对象的消息无法识别. (大概是这么个意思)



那如果再改一下呢?

#import <Foundation/Foundation.h>@interface Student : NSObject- (void)abcd;@end@implementation Student@endint main(){    Student *stu = [Student new];        [stu abcd];        return 0;}

编译结果:

Cain:2.第二天 Cain$ cc -c 3-OC弱语法.m3-OC弱语法.m:7:17: warning: method definition for 'abcd' not found [-Wincomplete-implementation]@implementation Student                ^3-OC弱语法.m:4:1: note: method 'abcd' declared here- (void)abcd;^1 warning generated.

链接运行结果:

Cain:2.第二天 Cain$ cc 3-OC弱语法.o -framework FoundationCain:2.第二天 Cain$ ./a.out 2015-01-16 20:25:14.458 a.out[13240:1440945] -[Student abcd]: unrecognized selector sent to instance 0x7fd1ea40e0602015-01-16 20:25:14.459 a.out[13240:1440945] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Student abcd]: unrecognized selector sent to instance 0x7fd1ea40e060'*** First throw call stack:(0   CoreFoundation                      0x00007fff9587464c __exceptionPreprocess + 1721   libobjc.A.dylib                     0x00007fff9b68b6de objc_exception_throw + 432   CoreFoundation                      0x00007fff958776bd -[NSObject(NSObject) doesNotRecognizeSelector:] + 2053   CoreFoundation                      0x00007fff957bea84 ___forwarding___ + 10284   CoreFoundation                      0x00007fff957be5f8 _CF_forwarding_prep_0 + 1205   a.out                               0x000000010af7ff64 main + 686   libdyld.dylib                       0x00007fff955795c9 start + 17   ???                                 0x0000000000000001 0x0 + 1)libc++abi.dylib: terminating with uncaught exception of type NSExceptionAbort trap: 6


还有一种结果:

#import <Foundation/Foundation.h>@interface Student : NSObject@end@implementation Student- (void)abcd{    }@endint main(){    Student *stu = [Student new];        [stu abcd];        return 0;}

编译链接运行结果:

Cain:2.第二天 Cain$ cc -c 3-OC弱语法.mCain:2.第二天 Cain$ cc 3-OC弱语法.o -framework FoundationCain:2.第二天 Cain$ 

在OC中, 可以不声明, 直接实现方法



这对初学者是非常的不利, 没有严格的语法规范, 那么在学习的过程中会有很多的错误写法, 所以我才严格要求大家要书写规范, 只有严格要求自己, 才能成为一个优秀的程序员.



好了这次就讲到这里, 下次我们继续~~~~~

0 0
原创粉丝点击