OC第一篇---类与对象
初学OC会有些不适应,接触了好多新语法,不过既然OC是从C衍生出来的,本质上还是雷同
的,根据我初学的经验来讲C和OC目前的区别有这些:
1.C的源文件是.c,OC的源文件是.m
2.C是面向过程,OC是面向对象的。
3.C是用函数完成功能,OC是用对象的方法完成某些功能。
4.C调用函数,OC用通过给对象发送消息调用方法。
5.OC中是使用@编译指令实现各种目的。
总之,OC初学,要用一种新的思维去融合,虽然C和OC是不同的语言,但是在OC中可以完全
兼容C的语法。例如用C输出一句话:
#import <Foundation/Foundation.h>
#include <stdio.h>
int main()
{
NSLog(@"OC语法");
printf("C语法");
}
这里import的特点有两点:
1.和include一样,引用文件。
2.可防止文件内容重复拷贝。
看到 Foundation 这是一个Foundation框架,只要用到OC中的函数,就要引入框架。
面向对象是个很抽象的概念,不过我可以这样去理解:面向对象就是一种解决问题的一种模
式,这种模式很符合认的思维。把所有的事物都可以当成一个对象,一个对象有它的属性,和它的
行为,当我们解决问题时,只需要考虑需要哪个对象就可以了。
而有对象首先需要有个模板,这个模板就是类。类是对象的抽象化,而对象是类的实例,是与
现实相对应的。
创建一个车对象的例子:
a) 需要先有汽车的建造图纸,图纸上描述清楚汽车应该具备的属性和功能(行为)
Ø 属性:轮子数、时速
Ø 功能(行为):跑
b) 然后再根据图纸上的描述生成汽车
c) 每一辆汽车都是对象,都有自己具体的属性值,都是图纸的实例
d) 图纸是抽象的,房子是具体的。图纸是对房子对象的高度概括
类创建的格式:
@interface 类名 :NSObject
{
成员变量1;
成员变量2 ;
........
}
- (返回值类型)方法名1; //方法的申明
- (返回值类型)方法名2;
.....
@end
@implementation 类型
- (返回值类型)方法名1
{
方法1实现的代码
}
- (返回值类型)方法名2
{
方法2实现的代码
}
@end
其中 @interface 是一个类的申明,后面以@end结尾。一个申明对应一个@implementation 是
类的实现,后面也以@end结尾。(@end一定要配对写),每一个方法以减号'-'开头,方法的申明不
能写到成员变量里面。类的实现用另一种含义来说就是方法的实现。类要继承父类:NSObject,这个
最基础的类。
设计一个人类例子:
类的声明:
#import <Foundation/Foundation.h>
@interface Peerson : NSObject
{ @public
int _age; //年龄
char *_name; //姓名
}
- (void) run; //申明一个跑的方法
@end
1.成员变量要写在@interface和@end的{}大括号中
2. @public可以让外界访问内部成员变量
3.继承父类:NSObject,可以调用new方法创建对象
类的实现:
@implementation Person
- (void)run
{
NSLog(@"姓名是%s年龄%d的人跑起来了",_name,_age);
}
main函数中创建人对象:
int main()
{
Person *p=[Person new];
p->_age=23;
p->_name="minglei";
[p run];
return 0;
}
代码分析:
这段代码,输出:姓名是minglei年龄23的人跑起来了,说到类的创建和实现,模板做好
了,就可以有人这个对象了。Person *p=[Person new]; 这个段代码就创建了一个新对象,[类
型 new]就可以创建一个新对象,并且在OC中只能通过指针去访问对象里的实例变量,也就是
说[Person new]也就是个地址,给了指针p,指针p即可以给年龄,姓名赋值了。而[p run]; 是指
针p给对象发送了一条run消息,对象接收并通过isa指针去类中找到这个run方法,从而实现了调
用方法。切记这里run是方法不是函数,方法和函数有以下几点区别:
方法:1.对象方法都是减号'-'开头。
2.对象方法的声明必须写在@interface和@end之间,对象方法的实现必须写在
@implementation和@end之间。
3.对象方法只能由对象调用。
4.对象方法归类/对象所有。
函数:1.函数可以写在任何位置,@interface和@end之间除外。
2.函数调用不依赖于对象,直接调用即可。
3.函数内部不能直接通过成员变量访问变量。
对象调用方法传递参数的注意:
在OC方法中,一个参数对应一个冒号,而冒号的作用就是分割方法名和参数值。为了规范
,方法起的要有意义,在这个代码中 (sumWithNum1: andNum2:)这是方法名,切记冒号也算
在方法名之中哦,而且一个类中可以没有成员变量的。
类的声明和实现:
1.在类的声明中会容易出现的错误:
(1).只有类的声明,没有类的实现
(2).漏了@end
(3).@ interface和@implementation嵌套
(4).两个类的声明嵌套
(5).成员变量没有写在括号里面
(6).方法的声明写在了大括号里面
2.OC方法和函数的区别:
1.OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。
2.C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
3.C函数不能访问OC对象的成员
方法:
1.不带参数的方法:
声明:- (void) p;
实现: - (void)p{ return 11;}
2.带参数的方法:
声明:- (void)number:(int)num1;
实现:-(void)number:(int)num1{ return num1+1;}
总结:面向对象更符合人思考和解决问题的一种模式,按照人的思维去解决问题,会考虑方方
面面,具体到位。并且面向对象编程安全性高,可移植性好,性能稳定,抽空你的思想和OC一起飞吧!