一、 面向对象
C语言是面向过程的,关注的是解决问题需要哪些步骤;OC是面向对象的,关注的是解决问题需要哪些对象。
例子:
打电话 " 找手机,不用分析电话拨通过程
电脑坏了" 找电脑维修工,不用分析修理的步骤
二、 类和对象
类和对象是面向对象中有2个非常重要的概念,面向对象解决问题是先考虑需要设计哪些类,再利用类创建多少个对象
1、 定义类
1) 类的声明
举例:
类名:Car
属性:轮子数、时速
行为:跑
#import <Foundation/Foundation.h>
// 类的声明
@interface Car : NSObject
{
@public
int _wheels; // 轮子数
int _speed; // 时速
}
- (void)run; // 跑的行为
@end
注:
- 类名的命名要有意义且首字母大写,成员变量名以下划线 _ 开头
- @interface的大括号中不能声明方法,只能声明成员变量,且不能初始化,默认初始值为0
- 此处的方法声明为 - (void)run; 其中 – 表示对象方法,void为返回值类型,run为方法名
- 加上 :NSObject的目的是让Car类具备创建对象的能力, @public成员变量类型,可以让Car对象的成员变量被外界访问
2) 类的实现
代码如下:
<pre code_snippet_id="594167" snippet_file_name="blog_20150131_2_685008" name="code" class="html">// 类的实现
@implementation Car
- (void) run
{
NSLog(@"%i个轮子,%i时速的车子跑起来了", _wheels, _speed);
}
@end
2、 创建对象
1) 代码如下
int main()
{
// 创建车子对象,用一个指针变量c指向内存中的Car对象
Car *p = [Car new];
c->_wheels = 4; // 对轮子赋值4
c->_speed = 200; // 对车子赋值200
[c run]; // 对方法进行调用
return 0;
}
2)
[Car new]每次都会创建出新的对象,并且返回对象的地址,所以用一个指针变量c保存对象的地址 ,如下图表示。
3)
// 创建多个Car对象,每个Car对象都有wheels、speed属性
Car *p1 = [Car new];
Car *p2 = [Car new];
// 一个赋值给另一个,然后修改属性
Car *p3 = [Car new];
p3->_wheels = 4;
p3->_speed = 200;
Car *p4 = p3;
p4->_speed = 150;
[p4 run];
3、 常见错误
- 只有类的声明,没有类的实现
- 没写@end
- @interface和@implementation嵌套
- 两个类的声明嵌套
- 成员变量没有写在大括号里面
- 方法的声明写在了大括号里面
- 方法只有声明,没有实现(经典错误)
- 方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)
- 编译的时候,访问没有的成员变量直接报错,访问没有的方法,只是警告
4、 语法细节
- OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间
- 成员变量不能在{}中进行初始化、不能被直接拿出去访问
- 方法不能当做函数一样调用
- 成员变量/方法不能用static等关键字修饰
- 类的实现可用写在main函数的后面,主要在声明后面就行了
三、方法
1、不带参数的方法
例如上面定义的run方法,再举一例说明
// 方法声明
- (double)pi;
// 方法实现
- (double)pi
{
return 3.14;
}
- (double)pi; - 代表方法类型,double为返回值类型,且要写在()内,pi为方法名
- 方法调用:[c pi]; c为一指针变量
2、带参数的方法
// 方法声明
- (int)sumWithNum1 :(int)num1 andNum2:(int)num2;
// 方法实现
- (int)sumWithNum1 :(int)num1 andNum2:(int)num2
{
return num1+num2;
}
- 方法名为sumWithNum1 : andNum2:
- 方法调用:[c sumWithNum1 :10 andNum2:20]