赞
踩
------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];
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。