之前, 我们学习了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弱语法.o
Undefined symbols for architecture x86_64:
"_asdasd", referenced from:
_main in 3-OC弱语法.o
ld: symbol(s) not found for architecture x86_64
clang: 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
@end
int main()
{
Student *stu = [Student new];
[stu abcd];
return 0;
}
链接的结果:
Cain:2.第二天 Cain$ cc -c 3-OC弱语法.m
3-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 Foundation
Cain: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 0x7f98b1c0e060
2015-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 + 172
1 libobjc.A.dylib 0x00007fff9b68b6de objc_exception_throw + 43
2 CoreFoundation 0x00007fff958776bd -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x00007fff957bea84 ___forwarding___ + 1028
4 CoreFoundation 0x00007fff957be5f8 _CF_forwarding_prep_0 + 120
5 a.out 0x0000000107d31f54 main + 68
6 libdyld.dylib 0x00007fff955795c9 start + 1
7 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Abort 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
@end
int main()
{
Student *stu = [Student new];
[stu abcd];
return 0;
}
编译结果:
Cain:2.第二天 Cain$ cc -c 3-OC弱语法.m
3-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 Foundation
Cain:2.第二天 Cain$ ./a.out
2015-01-16 20:25:14.458 a.out[13240:1440945] -[Student abcd]: unrecognized selector sent to instance 0x7fd1ea40e060
2015-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 + 172
1 libobjc.A.dylib 0x00007fff9b68b6de objc_exception_throw + 43
2 CoreFoundation 0x00007fff958776bd -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x00007fff957bea84 ___forwarding___ + 1028
4 CoreFoundation 0x00007fff957be5f8 _CF_forwarding_prep_0 + 120
5 a.out 0x000000010af7ff64 main + 68
6 libdyld.dylib 0x00007fff955795c9 start + 1
7 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Abort trap: 6
还有一种结果:
#import <Foundation/Foundation.h>
@interface Student : NSObject
@end
@implementation Student
- (void)abcd
{
}
@end
int main()
{
Student *stu = [Student new];
[stu abcd];
return 0;
}
编译链接运行结果:
Cain:2.第二天 Cain$ cc -c 3-OC弱语法.m
Cain:2.第二天 Cain$ cc 3-OC弱语法.o -framework Foundation
Cain:2.第二天 Cain$
在OC中, 可以不声明, 直接实现方法
这对初学者是非常的不利, 没有严格的语法规范, 那么在学习的过程中会有很多的错误写法, 所以我才严格要求大家要书写规范, 只有严格要求自己, 才能成为一个优秀的程序员.
好了这次就讲到这里, 下次我们继续~~~~~