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约会。
浙公网安备 33010602011771号