iOS之02-第一个OC的类
OC是一门面向对象的语言,因此它也有类、对象、静态\动态方法、成员变量的概念。这讲就来创建第一个OC的类。
第一个类的源码:
1 /* 2 人 3 类名:Person 4 属性(成员变量\实例变量):体重、年龄 5 行为(方法):走路、吃 6 */ 7 8 #import <Foundation/Foundation.h> 9 10 //1.类的声明 11 @interface Person : NSObject 12 { 13 @public 14 int age; 15 double weight; 16 } 17 18 - (void) walk; 19 - (void) eat; 20 @end 21 22 // 2.类的实现 23 @implementation Person 24 // 实现interface中声明的方法 25 - (void) walk { 26 NSLog(@"%d岁、%.2lf公斤的人走一段路", age, weight); 27 } 28 29 - (void) eat { 30 NSLog(@"%d岁、%.2lf公斤的人在吃东西", age, weight); 31 } 32 @end 33 34 int main() { 35 // 在使用类创建对象之前,会将类加载进内存 36 Person *p = [Person new]; 37 p->age = 20; 38 p->weight = 77.0; 39 40 [p eat]; 41 [p walk]; 42 return 0; 43 }
1.类的声明(代码11-20行):声明对象的属性和行为
10 //1.类的声明
11 @interface Person : NSObject
12 {
13 @public
14 int age;
15 double weight;
16 }
17
18 - (void) walk;
19 - (void) eat;
20 @end
代码第11行 : NSObject 目的是:让Car这个类具备创建对象的能力
代码第12-16行 用来声明对象属性(实例变量/成员变量,默认会初始化为0)
声明对象属性必须在 {...} 之间
@public让后面所有变量都可以被外部的指针间接访问对象内部的成员变量
成员变量的常用作用域有3种:
1> @public 全局都可以访问
2> @protected 只能在类内部和子类中访问
3> @private 只能在类内部访问
代码18、19行 是方法的声明
方法(行为):方法名、参数、返回值(声明、实现)
只要是OC对象的方法,必须以减号 - 开头
OC方法中任何数据类型都必须用小括号 (...) 括住
OC方法中的小括号():括住数据类型
2、类的实现(代码23-32行):用来实现@interface中声明的方法
22 // 2.类的实现
23 @implementation Person
24 // 实现interface中声明的方法
25 - (void) walk {
26 NSLog(@"%d岁、%.2lf公斤的人走一段路", age, weight);
27 }
28
29 - (void) eat {
30 NSLog(@"%d岁、%.2lf公斤的人在吃东西", age, weight);
31 }
32 @end
方法的声明请参考 视频iOS之04方法的声明和实现
3、主函数(代码34-43行)
34 int main() {
35 // 在使用类创建对象之前,会将类加载进内存
36 Person *p = [Person new];
37 p->age = 20;
38 p->weight = 77.0;
39
40 [p eat];
41 [p walk];
42 return 0;
43 }
在OC中想执行一些行为,就写上一个中括号[行为执行者 行为名称]
代码36行 利用类来创建对象
执行了Car这个类的new行为来创建新对象
定义了一个指针变量p,p将来指向的是Car类型对象
[Car new]每次都会创建出一个新对象,并且会返回新对象本身(新对象的地址)
代码37、38行 给p所指向对象的属性赋值
代码37、38行 给p所指向对象发送一条run信息
每个对象中都有一个isa的指针,这个指针就指向对象所对应的类
4、OC对象方法和函数的区别
方法
1> 对象方法都是以减号'-'开头
2> 对象方法的声明必须写在@interface和@end之间
对象方法的实现必须写在@implementation和@end
3> 对象方法只能由对象调用
4> 对象方法归对象所有
函数
1> 函数能写在文件中的任意位置(除了在对象声明部分(@interface和@end之间)),函数归文件所有
2> 函数调用不依赖于对象
3> 函数内部不能直接通过成员变量访问某个对象的成员变量