黑马程序员---ios开发---objective-c学习-01-简单类实现常见错误及分析

来源:互联网 发布:js if判断不等于1或2 编辑:程序博客网 时间:2024/06/16 14:41

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

前言

    最近在学习ios基础视频中objective-c编程语言,因为是初学者,经常在创建类时犯一些错误,我相信肯定也有同学会和我犯同样的错误,在此总结一下我经常会遇到的错误,以及分析一下每种错误会导致编译器如何报错。

首先我们定义一个Dog类:

Dog类中只有一个实例变量_age,代表狗的年龄。
Dog类中定义一个bark方法,实现狗叫功能
源代码如下:


<span style="font-size:14px;">#import<Foundation/Foundation.h>@interface Dog : NSObject{    int _age;}- (void)bark;@end  //Dog类@implementation Dog- (void)bark{    NSLog(@"woof woof woof");}@endint main(){    //Dog *d=[Dog new];    //[d bark];    return 0;}</span>

代码打印结果如下:

</pre><pre name="code" class="objc"><pre name="code" class="objc"><span style="font-size:14px;">2015-05-07 20:21:49.962 a.out[405:707] woof woof woof</span>

1、漏写了#import<Foundation/Foundation.h>

有的时候写代码时会漏写了预处理命令#import<Foundation/Foundation.h>,这时编译器能不能通过呢?我们来试一下!
</pre><pre name="code" class="objc" style="margin-top: 4px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; background-color: rgb(240, 240, 240); "><span style="font-size:14px;">class.m:3:18: error: cannot find interface declaration for 'NSObject',      superclass of 'Dog'@interface Dog : NSObject~~~~~~~~~~~~~~   ^class.m:13:5: warning: implicitly declaring library function 'NSLog' with type      'void (id, ...)'    NSLog(@"woof woof woof");    ^class.m:13:5: note: please include the header <Foundation/NSObjCRuntime.h> or      explicitly provide a declaration for 'NSLog'1 warning and 1 error generated.</span>

答案是不能,生成了一个警告和一个错误。我们来分析一下错误,错误是不能找到Dog类的superclass(超类),也就是父类NSObject,这个类是声明在Foundation.h头文件中,我们漏写了,所以报错。我们再分析一下警告,也是NSLog是一个库函数,是在Foundation.h中声明的,所以我们一定要记住包含Foundation框架。

2.@implementation后面没写Dog

方法实现后面没写类名,这样编译器会不会报错呢?我们编译一下。

<span style="font-size:14px;">class.m:11:1: error: expected identifier- (void)bark^class.m:11:1: error: missing context for method declarationclass.m:15:1: error: '@end' must appear in an Objective-C context@end^3 errors generated.</span>
<span style="font-size:14px;"></span>

我们发现报了三个错误,第一个是不可识别的标识符-,第二个是丢失了方法声明的文本,第三个是@end必须出现在objective-c文本中,这三个错误都是因为方法实现找不到对应的类,定义的方法也找不到对应的声明。这里声明和实现是成对出现的,后面都得跟上类名,才能配对。

3、定义实例变量时漏写了{  }

例如:

<span style="font-size:14px;">@interface Dog : NSObject    int _age;- (void)bark;@end</span>

这时也会报错

<span style="font-size:14px;">class.m:5:9: error: cannot declare variable inside @interface or @protocol    int _age;        ^1 error generated.</span>
<span style="font-size:14px;">错误提示为不能在@interface里面声明变量_age,这里{}不能省。应该把int _age用{}括起来;</span>

4、@interface后面漏写了@end

代码如下:

#import<Foundation/Foundation.h>

<span style="font-size:14px;">@interface Dog : NSObject{    int _age;}- (void)bark;漏写了@end//Dog类@implementation Dog- (void)bark{    NSLog(@"woof woof woof");}@endint main(){    //Dog *d=[Dog new];    //[d bark];    return 0;}</span>
<span style="font-size:14px;">我们编译一下,看会发生什么</span>
<pre name="code" class="objc"><span style="font-size:14px;">class.m:10:1: error: missing '@end'@implementation Dog^@endclass.m:3:1: note: class started here@interface Dog : NSObject^class.m:11:13: error: expected ';' after method prototype- (void)bark            ^            ;2 errors generated.</span>
<span style="font-size:14px;">这里报了两个错误,第一个是@interface后面没写@end,第二个是- (void)bark后面没写;,因为漏写了@end,这里把方法实现当成声明了,所以报错。</span>
<span style="font-size:14px;">这里我总结了四个我曾经犯过的错误,也根据我的学习给出了我的分析结果,希望各位同学批评指正。当然在学习越往后,我们会犯得错误也会越来越多,我们都要小心记录自己经常会犯得错误,以避免今后继续犯同样的错误。</span>

0 0
原创粉丝点击