06.Object-C--初探究竟OC类

   

   通过之前有一篇《01.Object-C--第一次亲密接触》,大体上已经对OC有了初步的认识,今天就让我们继续前行,来看看OC类。

   OC类,跟函数类似,OC类创建需要两部分:

   1.类的声明。声明对象的属性和行为。

   2.类的实现。

   其中,类的声明必须用: @interface @end 并且方法的声明不能写在{}里面。 类的实现必须用: @implementation @end。

   这里说一下类名的命名规范:类名要有意义,采用驼峰表示,首字母大写。

  下面我以Car类为例:

     Car类有两个属性:轮子个数和时速,一个行为:跑。

     成员变量在@interface的大括号{}中声明,wheels,speed。默认会初始化位0。

     @public设置了属性被外部访问的权限。

代码如下:

 1 //比如声明一个car类
 2 #import<Foundation/Foundation.h>
 3 @interface Car: NSObject
 4 {
 5     @public
 6     int wheels;//轮子
 7     int speed;//时速
 8 }
 9 /**
10  *在C语言中我们用函数的声明用
11    void run();
12  */
13 //方法的声明  OC方法中的(),用来扩住数据类型。OC方法中的任何数据类型都必须用小括号括起来。
14 -(void)run;//跑的行为
15 @end
16 
17 //实现car类
18 @implementation Car
19 -(void)run
20 {
21     NSLog(@"Car 跑起来了!");
22 }
23 @end
24 
25 //在main方法里面测试
26 int main()
27 {
28     Car *bMW = [Car new];//创建一个新的对象Car bMW,并将返回的对象地址保存在bMW中  即用指针变量bMW指向内存中的Car对象。
29     bMW->wheels = 4;
30     bMW->speed = 270;
31     //给bMW 所指向的对象发送一条run消息。
32     [bMW run];
33     NSLog(@"%i个轮子时速为%ikm/h,使BWM跑起来了",bMW->wheels,bMW->speed);
34     return 0;
35 }

运行结果如下:

接下来,我们以另一个类,Person类为例,来进行一个简单的内存分析。

 类名:Person

 属性(成员变量/实例变量):age,weight;

 行为(方法):walk;

首先我们先对Person类进行声明,如下:

1 #import <Foundation/Foundation.h>
2 @interface Person:NSObject
3 {
4     @public
5     int age;
6     float weight;
7 }
8 - (void)walk;
9 @end

接下来我们对Peraon类进行实现,如下:

1 @implementation Person
2 //实现interface中声明的方法walk
3 - (void)walk
4 {
5     NSLog(@"来,走两步,走两步$_$");
6     NSLog(@"%i岁、%fkg的人朝光的地方走去",age,weight);
7 }
8 @end

最后我们使用main(),来看看我们对Person类,对象的操作,如下:

 1 int main()
 2 {
 3 //创建2个Person对象boy  girl
 4     Person  *boy = [Person new];
 5     boy->age = 25;//访问boy所指向的age属性
 6     boy->weight = 70.0;
 7     [boy walk];
 8 
 9     Person *girl = [Person new];
10     girl->age = 25;
11     girl->weight = 50.0;
12     [girl walk];
13     return 0;
14 }

运行结果如下图:

下来我们通过图例来进行简单的内存分析:

  假定创建一个新的对象Person,那么首先内存就有一个Person类,它有walk这个行为。然后会有一个指针boy,将返回的对象地址保存在boy中,即用指针变量boy指向内存中的Person对象,boy保存的地址为ffc0。在对应地址为ffc0的内存中就有一个Person对象,该对象有两个属性age = 25,weight = 70.0。注意的一点是,在任何对象中都有一个isa指针,指向对应的类。此刻它的对应类就是Person类。同理girl指针所指向的Person对象中的isa也是指向Person类的。

  好了,简单分析了一下对象的内存。下面我们来说一说,函数和方法的区别:

    函数和方法的区别:

  方法:

  1.对象方法的声明必须写在 @interface 和@end之间。

  2.对象的实现必须在@implementation和@end 之间。

  3.对象的方法只能由对象调用。

  4.对象方法归类\对象所有。

如下代码:

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Car :NSObject
 4 {
 5     int wheels;
 6     int speed;
 7 }
 8 
 9 - (void) run;
10 @end
11 
12 @implementation Car
13 //方法 对象方法归对象/类所有。
14 - (void) run
15 {
16 
17 }
18 @end

 函数:

 1.函数能写在文件中的任意位置,归文件所有。

 2.函数调用不依赖对象。

 3.函数内部不能直接通过成员变量名访问某个对象的成员变量。

如下:

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Car :NSObject
 4 {
 5     int wheels;
 6     int speed;
 7 }
 8 
 9 - (void) run;
10 @end
11 
12 @implementation Car
13 //方法 对象方法归对象/类所有。
14 - (void) run
15 {
16 
17 }
18 
19 @end
20 
21 //run函数(函数是属于文件所有,可以在文件中的任意位置)
22 void run
23 {
24 
25 }

  既然大体上已经知道了函数和方法的区别,下来说说初学者在学习写代码的时候常见的一些错误:

  常见错误:

  1.@inteface与 @implementation嵌套。如下这种代码是错误的:

 1 //1.@inteface与 @implementation嵌套
 2 @inteface Cat :NSObject
 3 {
 4     int weight;
 5 }
 6 -(void)eat;
 7 @implementation Cat
 8 
 9 - (void)eat
10 {
11     NSLog(@"eat fish");
12 }
13 
14 @end
15 @end
16 属于错误代码。

  2.只有类的声明,没有类的实现。

  3.漏掉@end。

  4.多重类的声明嵌套。

  5.成员变量没有写在大括号{}里面。

  6.方法的声明写到了大括号{}里面。

这些都是常见的错误。还有一些应该注意的:

  1.成员变量不能在{}里面进行初始化,也不能够被直接拿去访问。

  2.方法和函数不同,不能当作函数一样调用。

  3.不要将C语言的关键字修饰和OC的混在一起,比如不能使用static修饰成员变量,方法。

  4.方法有声明,但是实现的时候写成了函数,这个低级错误我十分留意。

  5.方法没有声明,只有实现,编译器会警告,但是能调用。

  6.编译的时候,访问没有的成员变量将直接报错,访问没有的方法,只是警告。

  7.在没有@interface的情况下,只有@implementation,也能够成功定义一个类。

如下:

 1 @implementation Car :NSObject
 2 {
 3     @public
 4     int wheels;
 5     int speed;
 6 }
 7 //方法 对象方法归对象/类所有。
 8 - (void) run
 9 {
10     NSLog(@"车子跑起来");
11 }
12 
13 @end

但是需要注意的是:@omplementation中不能声明和@interface一样的成员变量。

  好啦!今天就先到这里了,该伸伸懒腰,活动活动筋骨,出去呼吸一下新鲜的空气。下次继续和OC约会。

 

posted @ 2015-03-31 14:05  Qingyun_Qearl  阅读(263)  评论(0)    收藏  举报