OC基础—面向对象思想(思想很重要)

来源:互联网 发布:复利农场源码 编辑:程序博客网 时间:2024/05/21 14:47

------ android培训java培训、期待与您交流! ----------



                                                                     OC基础—面向对象思想

         OC是面向对象的,C是面向过程的。面向对象和面向过程是解决问题的两种不同思想。

         区别:

         1. 面向过程关注的是解决问题需要哪些步骤,面向对象关注的是解决问题需要哪些东西(对象)。

         2. 没有开发经验很难感受到他们的区别,两种思想都能达到解决问题的目的,但是解决思路不一样

        

         常用术语:

         面向过程: Procedure Oriented

         面向对象: Object Oriented(OO)

         面向对象编程: Object Oriented Programming(OOP)

 

          类和对象

         面向对象中有两个非常重要的概念:类和对象   

    现实生活的例子:如何创造汽车对象?

    1.  需要先有汽车的建造图纸,图纸上描述清楚汽车应该具备的属性和功能(行为)

     属性:轮子数、时速

     功能(行为):跑

    2.  然后再根据图纸上的描述生成汽车

    3.  每一辆汽车都是对象,都有自己具体的属性值,都是图纸的实例

    4.  图纸是抽象的,房子是具体的。图纸是对房子对象的高度概括

    上面图纸就可以看做类,车子就是对象。

 

    要描述OC中的类稍微麻烦一点,分为2大步骤:类的声明,类的实现

    类的设计:

    1> 类名:

    * 类名的第一个字母要大写

    * 不能有下划线

    * 多个英文单词,用驼峰标识

 

类的声明:

   代码编写(举个例子)

    * 定义一个Car类,拥有2个属性:轮子数、时速,1个行为:跑

    * 类名\属性的命名规则:标示符的规则

    * 类名的命名规范:有意义、驼峰标识、首字母大写

#import<Foundation/Foundation.h> // 类的声明@interface Car : NSObject // 这个是继承语法,目的是让Car这个类具备创建对象的能力{ // 大括号用来声明对象属性(成员变量,默认初始化为0)    @public // 这个关键字后面的所有变量可以被外部的指针间接访问    int wheels; // 轮胎个数    int speed; // 时速}@end// 类的实现@implementation Car @end int main( ){    // 利用类来创建对象    // 在OC中想执行一些行为,就写上一个[行为执行者 行为名称];    // 执行了Car这个类的new行为来创建对象    // 定义一个指针变量p,p将来指向的是Car类型的对象    // [Car new]会创建出一个新对象,并返回对象本身    Car *p = [Car new];    p->wheels = 4; // 给p所指向的对象的wheels属性赋值    p->speed = 250;    NSLog(@"%d-%d", p->speed,p->wheels);    return 0;}

    1. 类的声明必须使用关键字@interface,而且不要忘了@end

    2. 类的声明中的大括号是用来声明成员变量的,成员方法放到大括号外面@interface,@end之间,成员变量使用@public之后才可以被外部指针间接访问。

    3. 创建时使用[Car new]来创建一个新对象,可以使用着这个对象类型的指针来指向这个类Car *p。

 

类的实现:

#import<Foundation/Foundation.h> // 类的声明@interface Car : NSObject // 这个是继承语法,目的是让Car这个类具备创建对象的能力{ // 大括号用来声明对象属性(成员变量,默认初始化为0)    @public // 这个关键字后面的所有变量可以被外部的指针间接访问    int wheels; // 轮胎个数    int speed; // 时速}// 方法(行为):方法名、参数、返回值(声明,实现)// 只要是OC对象的方法,必须已 - 开头// OC方法中任何数据类型都必须用小括号()括住// OC方法中的小括号():括住我们的数据类型- (void)run; @end// 类的实现// 用来实现@interface中声明的方法@implementation Car// 方法的实现(说清楚方法里面有什么代码)- (void)run{    NSLog(@"车子跑起来了");}@end int main( ){    Car *p = [Car new];    [p run]; // 给P所指向的对象发送一条run消息    return 0;}

    1. 方法的声明关键字@implementation结束关键字@end,缺一不可。

    2. 使用[p new]来调用对象的方法,这就是OC的消息机制,给p所指向的对象发送一条消息。

    3. 方法的声明和方法的实现是同时存在的。

 

方法与成员变量:看一段代码   

#import<Foundation/Foundation.h> // 定义一个类Person@interface Person : NSObject{    // 成员变量    @public    int age;    double weight;}// 方法- (void)walk;@end// 类的实现@implementation Person- (void)walk{    NSLog(@"%d岁,%f多少KG的人走起来了", age, weight);}@end int main( ){    // 创建一个对象    Person *p = [Person new];    p->age = 20;    p->weight = 50;    [p walk];       Person *p2 = [Person new];    p2 = p;    p2->age = 30;    p2->weight = 60;    [p2 walk];    return 0;}

    结果是:20岁,50.000000多少KG的人走起来了
               30岁,60.000000多少KG的人走起来了

    这就要考虑成员变量与方法在对象内存作用。

    指向对象的指针中储存的是这个对象的地址!

    Person *p =[Person new]; 指针p指向这个对象,所以p可以间接操作这个对象内部的成员变量和方法,给其赋值和调用。同理

    Person *p2 =[Person new]; p2也可以间接操作它指向的对象,但是

    p2 = p; 将指针p的地址付给了p2,所以p2转指向p所指向的对象,所以p2只能操作p所指向的对象的成员变量和方法。

 

对象的简单内存分析:

    1. 在使用类创建对象之前,会将类加载近内存,而且只会加载一次。

    2. 这个类里面只有一个方法列表,就是@interface中声明的方法。

    3. 每个对象内部有一个isa指针,这个指针指向对象所对应的类。

    4. 对象调用方法时,对象会根据isa指针到类中寻找相应的方法。

   

对象与函数参数:

#import <Foundation/Foundation.h> @interface Car : NSObject{    @public    int wheels;    int speed;}- (void)run;@end@implementation Car- (void)run{    NSLog(@"%d个轮子,速度为%d的车子跑起来了", wheels,speed);}@end void test(int w, int s){    w = 20;    s = 200;}void test2(Car *p){    p->wheels = 5;} int main( ){    Car *c = [Car new];    c->speed = 250;    c->wheels = 4;       test2(c);    [c run];    return 0;}

    结果是:5个轮子,速度为250的车子跑起来了
    void test(int w, int s);是值传递,不会对对象成员变量有任何影响。

    void test2(Car *p);传递的是指针,这个指针指向对象,可以对对象的成员变量进行操作。

   

OC方法与函数区别:

    1. 对象方法都是以 - 开头

    2. 对象方法的声明必须写在@interface与@end之间

        对象方法的声明必须写在@implementation与@end之间

    3. 对象方法只能由对象来调用

    4. 函数可以写在文件的任意地方(@interface与@end之间除外),函数归文件所有

    5. 函数调用不依赖于对象

    6. 函数内部不能直接通过成员变量名访问某个对象的成员变量

   

匿名对象:

#import<Foundation/Foundation.h> @interface Car : NSObject{    @public    int speed;}- (void)run;@end@implementation Car - (void)run{    NSLog(@"速度为%d的车子跑起来了");} @endint main( ){    // 有名字的对象    Car *c = [Car new];    c->speed = 250;    // 匿名对象    [Car new]->speed = 300;    [[Car new] run];    return 0;}

但是写这样的匿名对象不好,会造成内存泄露。

 


------ android培训java培训、期待与您交流! ----------

0 0
原创粉丝点击