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

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

前言

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

首先我们定义一个Dog类:

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


#import
@interface Dog : NSObject
{
    int _age;
}
- (void)bark;
@end  //Dog类
@implementation Dog
- (void)bark
{
    NSLog(@"woof woof woof");
}
@end
int main()
{
    //Dog *d=[Dog new];
    //[d bark];
    return 0;
}

代码打印结果如下:

2015-05-07 20:21:49.962 a.out[405:707] woof woof woof

 
  

1、漏写了#import

有的时候写代码时会漏写了预处理命令#import,这时编译器能不能通过呢?我们来试一下!
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  or
      explicitly provide a declaration for 'NSLog'
1 warning and 1 error generated.

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

2.@implementation后面没写Dog

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

class.m:11:1: error: expected identifier
- (void)bark
^
class.m:11:1: error: missing context for method declaration
class.m:15:1: error: '@end' must appear in an Objective-C context
@end
^
3 errors generated.

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

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

例如:

@interface Dog : NSObject

    int _age;

- (void)bark;
@end

这时也会报错

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

4、@interface后面漏写了@end

代码如下:

#import

@interface Dog : NSObject
{
    int _age;
}
- (void)bark;
漏写了@end//Dog类
@implementation Dog
- (void)bark
{
    NSLog(@"woof woof woof");
}
@end
int main()
{
    //Dog *d=[Dog new];
    //[d bark];
    return 0;
}
我们编译一下,看会发生什么
class.m:10:1: error: missing '@end'
@implementation Dog
^
@end

class.m:3:1: note: class started here
@interface Dog : NSObject
^
class.m:11:13: error: expected ';' after method prototype
- (void)bark
            ^
            ;
2 errors generated.
 
  
这里报了两个错误,第一个是@interface后面没写@end,第二个是- (void)bark后面没写;,因为漏写了@end,这里把方法实现当成声明了,所以报错。
这里我总结了四个我曾经犯过的错误,也根据我的学习给出了我的分析结果,希望各位同学批评指正。当然在学习越往后,我们会犯得错误也会越来越多,我们都要小心记录自己经常会犯得错误,以避免今后继续犯同样的错误。

你可能感兴趣的:(objective-c)