【黑马程序员】iOS学习之路——Objective-C之面向对象

来源:互联网 发布:php 当天0点时间戳 编辑:程序博客网 时间:2024/05/19 23:03

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


一、面向对象和面向过程

OC是面向对象的,C是面向过程的。面向对象和面向过程只是解决问题的两种不同思想1.面向对象和面向过程的区别1)以用电脑听歌为例子  a)面向过程打开电脑 播放电脑中的歌曲 关闭电脑  b)面向对象(不是相亲的“对象”)电脑(对象)   开机   播放歌曲   关机2)区别分析    面向过程关注的是解决问题需要哪些步骤;面向对象关注的是解决问题需要哪些对象    没有开发经验很难感受到它们的区别,两种思想都能达到解决问题的目的,但是解决思路不一样
2.现实生活中面向对象的例子想打电话\发短信 → 找手机,不用分析电话要怎样才能拨通去饭店吃饭 → 找服务员,不用分析怎么到厨房炒菜汽车坏了 → 找汽车维修工,不用分析修车的步骤境界:万物皆对象
3.常用术语面向过程 Procedure Oriented面向对象 Object Oriented,简称OO面向对象编程 Object Oriented Programming,简称OOP
二、类和对象

面向对象中有2个非常重要的概念:类和对象1.如何创建对象1)面向对象解决问题的时候必须有对象,那如何创建对象呢?2)现实生活的例子:如何创造汽车对象?a)需要先有汽车的建造图纸,图纸上描述清楚汽车应该具备的属性和功能(行为)属性:轮子数、时速功能(行为):跑b)然后再根据图纸上的描述生成汽车c)每一辆汽车都是对象,都有自己具体的属性值,都是图纸的实例d)图纸是抽象的,房子是具体的。图纸是对房子对象的高度概括2.OC中的面相对象1)OC中的类相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类2)OC利用类来创建对象,对象是类的具体存在3)因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象3.需要设计哪些类,如何设计类1)类的设计,只关心3样东西:事物名称(类名):人(Person)属性:身高(height)、年龄(age)行为(功能):跑(run)、打架(fight)2)一般名词都是类坦克发射3颗炮弹轰掉了2架飞机小明在公车上牵着一条叼着热狗的狗
三、定义OC类和创建OC对象

接下来就在OC中模拟现实生活中的情况,创建一辆车出来。首先要有一个车子类,然后再利用车子类创建车子对象要描述OC中的类稍微麻烦一点,分2大步骤:类的声明、类的实现(定义)。跟函数类似,函数有分声明和定义1.类的声明1)代码编写定义一个Car类,拥有2个属性:轮子数、时速,1个行为:跑类名\属性的命名规则:标示符的规则类名的命名规范:有意义、驼峰标识、首字母大写#import <Foundation/Foundation.h>// 类的声明@interface Car : NSObject{    @public    int wheels; // 多少个轮子    int speed; // 时速}- (void)run; // 跑的行为@end2)成员变量@interface的大括号{}中声明的变量:wheels、speed@interface的大括号和函数的大括号是不一样的默认会初始化为03)@public@public可以让Car对象的wheels和speed属性被外界访问4)NSObject加上:NSObject的目的是让Car类具备创建对象的能力2.类的实现// 类的实现@implementation Car- (void) run{    NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);}@end
3.创建对象1)代码编写// 主函数int main(){    // 创建车子对象    Car *c = [Car new];    c->wheels = 3;    c->speed = 300;        [c run];    return 0;}2)main函数的代码分析、内存分析(对象在内存中有成员)[Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址Car *c = [Car new];用一个指针变量c指向内存中的Car对象设置车子对象的属性跟用指向结构体的指针访问结构体属性一样,用->c->wheels = 3;c->speed = 300;
4.创建多个Car对象分别只设置wheels、speed属性Car *c1 = [Car new];c1->wheels = 4;Car *c2 = [Car new];c2->speed = 250;[c1 run];1个赋值给另一个,然后修改属性Car *c1 = [Car new];c1->wheels = 4;c1->speed = 250;Car *c2 = c1;c2->wheels = 3;[c1 run];
5.完整的例子/* 类名:Car 属性:轮胎个数、时速(速度) 行为:跑 */// 因为使用了NSObject#import <Foundation/Foundation.h>// 完整地写一个函数:函数的声明和定义(实现)// 完整地写一个类:类的声明和实现// 1.类的声明// 声明对象的属性、行为// : NSObject 目的是:让Car这个类具备创建对象的能力@interface Car : NSObject{// 用来声明对象属性(实例变量\成员变量,默认会初始化为0)    // @public可以让外部的指针间接访问对象内部的成员变量    @public    int wheels; // 轮胎个数    int speed; // 时速(xxkm/h)}// 方法(行为):方法名、参数、返回值(声明、实现)// 只要是OC对象的方法,必须以减号 - 开头// OC方法中任何数据类型都必须用小括号()扩住// OC方法中的小括号():括住数据类型- (void)run;@end// 2.类的实现// 用来实现@inteface中声明的方法@implementation Car// 方法的实现(说清楚方法里面有什么代码)- (void)run{    NSLog(@"车子跑起来了");}@endint main(){    // 在OC中,想执行一些行为,就写上一个中括号[行为执行者 行为名称]    // 利用类来创建对象    // 执行了Car这个类的new行为来创建新对象        // 定义了一个指针变量p,p将来指向的是Car类型的对象    // [Car new]每次都会创建出一个新对象,并且会返回新对象本身(新对象的地址)    Car *p = [Car new];            Car *p2 = [Car new];    p2->wheels = 5;    p2->speed = 300;    [p2 run];        // 给p所指向对象的wheels属性赋值    p->wheels = 4;    p->speed = 250;        // 给p所指向对象发送一条run消息    [p run];        NSLog(@"车子有%d个轮子,时速位:%dkm/h", p->wheels, p2->speed);        return 0;}
四、类的声明和实现

常见错误只有类的声明,没有类的实现漏了@end@interface和@implementation嵌套两个类的声明嵌套成员变量没有写在括号里面方法的声明写在了大括号里面语法细节成员变量不能在{}中进行初始化、不能被直接拿出去访问方法不能当做函数一样调用成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)类的实现可用写在main函数的后面,主要在声明后面就行了
OC方法和函数的区别OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有C函数不能访问OC对象的成员低级错误:方法有声明,但是实现的时候写成了函数/* 方法 1.对象方法都是以减号 -  2.对象方法的声明必须写在@interface和@end之间   对象方法的实现必须写在@implementation和@end之间 3.对象方法只能由对象来调用 4.对象方法归类\对象所有  函数 1.函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有 2.函数调用不依赖于对象 3.函数内部不能直接通过成员变量名访问某个对象的成员变量  */#import <Foundation/Foundation.h>@interface Person : NSObject@end@implementation Person@end@interface Car : NSObject{// 成员变量\实例变量    //int wheels = 4; 不允许在这里初始化    //static int wheels; 不能随便将成员变量当做C语言中的变量来使用    @public    int wheels;}- (void)run;- (void)fly;@endint main(){    // wheels = 10;    /*    Car *c = [Car new];    c->wheels = 4;    //run();        [c run];    */        void test2();        test2();        return 0;}@implementation Car- (void) fly{    }/*void test2(){    NSLog(@"调用了test2函数-%d", wheels);}*/void test(){    NSLog(@"调用了test函数");}- (void)run{    test();    NSLog(@"%d个轮子的车跑起来了", wheels);}@end
五、方法的声明

#import <Foundation/Foundation.h>/*计算器类 方法: 1> 返回 π  2> 计算某个整数的平方 3> 计算两个整数的和*/@interface JiSuanQi : NSObject// 方法名:pi- (double)pi;// OC方法中,一个参数对应一个冒号// 方法名:pingFang:(冒号也是方法名的一部分)- (int)pingFang:(int)num;//- (int)sum:(int)num1 :(int)num2;// 方法名:sumWithNum1:andNum2:- (int)sumWithNum1:(int)num1 andNum2:(int)num2;//- (int)sumWithNum1:(int)num1 andNum2:(int)num2 andNum3:(int)num3;@end@implementation JiSuanQi- (double)pi{    return 3.14;}- (int)pingFang:(int)num{    return num * num;}//- (int)sum:(int)num1 :(int)num2- (int)sumWithNum1:(int)num1 andNum2:(int)num2{    return num1 + num2;}@endint main(){    JiSuanQi *jsq = [JiSuanQi new];            int a = [jsq sumWithNum1:20 andNum2:5];    //int a = [jsq sum:10 :5];        //int a =  [jsq pingFang:10];        //double a = [jsq pi];    NSLog(@"%i", a);        return 0;}
六、匿名对象

#import <Foundation/Foundation.h>@interface Car : NSObject{    @public    int speed;}- (void)run;@end@implementation Car- (void)run{    NSLog(@"速度为%d的车子跑起来了", speed);}@endint main(){    /*    Car *c;    c = [Car new];    c->speed = 250;        [c run];*/        // 不要写类似匿名对象这样的代码    // 只要求能说出输出结果    [Car new]->speed = 300;        [[Car new] run];        //Car *c = [Car new];        return 0;}
七、实例练习

/*设计一个方法,用来和其他车比较车速,返回车速的差距 */#import <Foundation/Foundation.h>@interface Car : NSObject{    @public    int speed;}- (int)compareSpeedWithOther:(Car *)other;@end@implementation Car- (int)compareSpeedWithOther:(Car *)other{    // speed    // other->speed    // 返回当前这辆车和other这辆车的速度差距    return speed - other->speed;}@endint main(){    Car *c1 = [Car new];    c1->speed = 300;        Car *c2 = [Car new];    c2->speed = 250;        int a = [c1 compareSpeedWithOther:c2];        NSLog(@"a=%d", a);        return 0;}









0 0