------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
黑马程序员-iOS基础-Objective-C基础(二)
面向对象思想及类
一、面向对象思想
1、面向过程/面向对象思想
面向过程: 关注的是解决问题需要哪些步骤
面向对象: 关注的是解决问题需要哪些对象
常用术语
面向过程 Procedure Oriented
面向对象 Object Oriented,简称OO
面向对象编程 Object Oriented Programming,简称OOP
二、类
1、思想
类和对象的关系
先设计类,根据类创建对象
如何设计类(把拥有相同或相似属性和行为的对象抽象出一个类)
名称,有意义
1.类名的第一个字母必须大写
2.不要用下划线
3.多个英文单词用驼峰标识
属性
行为
2、写一个类
类的声明
作用:声明类的属性、行为
格式:
@interface 类名 : NSObject
{// 声明对象属性(成员变量)
@public//允许外部访问
}
//方法声明
- (返回值类型)方法名:参数列表;
@end
举例
@interface Person :NSObject
{
@public
int age;
double weight;
}
- (void)walk;
- (void)eat;
@end
类的实现
指在类的声明部分中声明的类的方法的实现,也即类的方法中所包含的代码
格式:
@implementation 类名
- (返回值类型)方法名
{
方法体
}
@end
举例
@implementation Person
- (void)walk
{
//成员变量作为参数传入不需要在声明中特地写出来,直接使用即可
NSLog(@"%d岁、%.1f kg的人在走路",age,weight);
}
- (void)eat
{
NSLog(@"吃了点东西");
}
@end
3、类的简单内存分析
内存
类在内存中也要占一份空间
在使用类创建对象之前,会将类加载进内存,并且只会加载一次
内存中只包含类内部的方法列表
对象
根据类创建的每一个对象,都有一个isa指针指向创建该对象的类
调用方法的实质
对象调用其方法,指该对象根据其内部的isa指针找到创建对象的类,在类中寻找需要调用的方法
如果有对应方法则执行,并根据需要传入对象本身的成员变量
4、OC对象与函数
对象成员变量作为函数参数
指向对象的指针作为函数参数
修改指向对象的成员
修改指针的指向
5、类的声明和实现
@interface和@implementation的分工
@interface就好像暴露在外面的时钟表面
@implementation就好像隐藏在时钟内部的构造实现
6、常见错误
只有类的声明,没有类的实现
漏了@end
@interface和@implementation嵌套
两个类的声明嵌套
成员变量没有写在括号里面
方法的声明写在了大括号里面
7、语法细节
成员变量不能在{}中进行初始化、不能被直接拿出去访问
方法不能当做函数一样调用
成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)
类的实现可用写在main函数的后面,主要在声明后面就行了
8、OC方法和函数的区别
OC方法
对象方法都是以减号-开头
OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间,也就是说OC方法不能独立于类存在
对象方法只能由对象来调用
对象方法归类/对象所有
C函数
函数能写在文件中的任意位置@interface与@end之间除外,函数归文件所有
C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
函数调用不依赖于对象
C函数不能直接通过变量名访问OC对象的成员
低级错误:方法有声明,但是实现的时候写成了函数
9、类的合理设计
不带参数方法
// 方法声明
- (double)pi;
// 方法实现
- (double)pi
{
return 3.14;
}
声明
实现
带参数方法
// 方法声明
- (double)square:(double)number;
// 方法实现
- (double)square:(double)number
{
return number * number;
}
声明
实现
带多个参数的方法
// 方法声明
- (double)sumOfNum1:(double)num1 andNum2:(double)num2;
// 方法实现
- (double)sumOfNum1:(double)num1 andNum2:(double)num2
{
return num1 + num2;
}
声明
实现
方法名注意
冒号也是方法名的一部分, 同一个类中不允许两个对象方法同名
练习:给Car类设计一个方法,用来和其他车比较车速,返回车速的差距
/*
给Car类设计一个方法,用来和其他车比较车速,返回车速的差距
*/
#import <Foundation/Foundation.h>
@interface Car :NSObject
{
@public
int speed;
}
- (int)compareSpeedWithOther:(Car *)other;
@end
@implementation Car
- (int)compareSpeedWithOther:(Car *)other
{
//speed--当前车的speed
//other->speed--其他车的speed
return speed-other->speed;
}
@end
int main()
{
Car *c1=[Car new];
c1->speed=300;
Car *c2=[Car new];
c2->speed=200;
int deltaSpeed=[c1 compareSpeedWithOther:c2];
return 0;
}
10、匿名对象
没有名字的对象,很少用
要求至少能看懂语法
l 属性访问
[Car new]->speed = 200;
l 方法调用
[ [Car new] run];