zoukankan      html  css  js  c++  java
  • Objective

    前面我们知道了怎么设计类, 以及怎么创建类, 那么这次我们来讲讲OC的对象与函数吧~~


    下面我们来看一个例子~~

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


    前面我们知道了, OC和C是可以混编的, 而且是完全兼容, 那么问题来了, 如果我改一下呢?

    void test(Car *newC)
    {
        newC->wheels = 5;
    }
    
    int main()
    {
        Car *p = [Car new];
        p->wheels = 8;
        p->speed = 250;
        
        test1(p);
        
        [p run];
        
        return 0;
    }

    那么它在内存的存储空间又是怎样呢?? 我们来看看示意图:



    首先, 我们来分析一下:

    1. 创建了Car类的一个对象, [Car new]并且用Car *p指向了它, 所以获得了这个对象的地址ffd0.

    2. 给对象的wheels和speed赋值.

    3. 创建一个test函数, 参数是Car *newC类型, 并且把p传入进去.

    4. test函数里就获得了p的地址, 并且给wheels赋值.

    所以输出的结果就是:

    2015-01-13 22:22:47.565 a.out[7420:745547] 5个轮子, 速度为250/km车子跑起来了
    



    那如果再改一些呢?

    void test1(Car *newC)
    {
        Car *c2 = [Car new];
        c2->wheels = 2;
        c2->speed = 80;
        
        newC = c2;
        newC->wheels = 1;
    }
    
    int main()
    {
        Car *p = [Car new];
        p->wheels = 8;
        p->speed = 250;
        
        test(p->wheels, p->speed);
        
        test1(p);
        
        [p run];
        
        return 0;
    }


    下面我们来看看示意图:



    解析一下:

    1. 把p的地址传入到test函数里.

    2. 在test函数里创建了一个新的对象.

    3. 把新的内存对象地址给了newC, 也就是说p和里面的newC已经没有关系了, 所以改变了newC的wheels的值, p也不会改变.


    所以输出的结果是:

    2015-01-14 00:20:48.310 a.out[7671:783844] 8个轮子, 速度为250/km车子跑起来了
    




    好了, 这次我们就讲到之类, 下次我们继续~~~

  • 相关阅读:
    C++ malloc 和 new 的函数说明
    C++ const 和static的总结以及使用
    动态库与静态库的区别
    C++引用和指针的区别
    gdb的调试常用命令
    FFMPEG的函数翻译文档
    STL在数组算法的使用
    iOS开发 给Label加下划线、中划线
    更改字符串颜色(长度不确定,有服务器返回)
    iOS 获取键盘高度
  • 原文地址:https://www.cnblogs.com/iOSCain/p/4282862.html
Copyright © 2011-2022 走看看