zoukankan      html  css  js  c++  java
  • 第一条:了解Objective-C语言的起源

    第一条:了解Objective-C语言的起源

    Objective-C使用的消息结构而非函数调用。
    Objective-C的重要工作都由“运行组件(runtime component)”而非编译器来完成。使用Objective-C的面向对象特性所需的全部数据结构以及函数都在运行期组件里面。需要明白:Objective-C语言中的指针是用来指示对象的。想要声明一个变量,令其指向某个对象,可用以下语法:

       NSString *someString = @"The string";
    

    这种语法基本上是照搬C语言的,它声明了一个名为someString的变量,其类型是NSString*。也就是说,此变量为指向NSString的指针。所有Objective-C语言的随想都必须这样声明,因为对象所占内存总是分配在“堆空间”(heap space)中,而绝不会分配在“栈”(stack)上。不能在栈中分配Objective-C对象:

       NSString stackString;
    

    someString变量指向分配在堆里面的某块内存,其中含有一个NSString对象。也就是说,如果再创建一个变量,令其指向同一地址,那么并不拷贝该对象,只是这两个变量会同时指向此对象:

    #import <Foundation/Foundation.h>
    int main(int argc, const char * argv[]) {
    @autoreleasepool {
       NSString *name = @"Scott";
        NSString *nickName = name;
        NSLog(@"name's address is:%p",name);
        NSLog(@"nickName's address is:%p",nickName);
    }
    return 0;
    
    }
    

    输出的结果是:

    2015-07-26 15:20:06.905 Test52[5631:1767824] name's address is:0x100001038
    2015-07-26 15:20:06.905 Test52[5631:1767824] nickName's address is:0x100001038
    

    我们会发现,他们其实指向的是同一块内存。其中,只有一个NSString的实例,然而有两个变量指向此实例。这两个变量都是NSString* 型,这说明当前“栈帧(stack frame)”里面分配了两块内存,每块内存的大小都能容下一枚指针(在32位架构的计算机上是4字节,64位计算机上是8个字节)。这两块内存里的值都是一样,就是NSString实例的内存地址。
    Valid XHTML
    此图片内存布局演示了一个 分配在堆中的NSString实例,有两个分配在栈上的指针指向该实例。
    分配在堆中的内存必须直接管理,而分配在栈上用于保存变量的内存则会在栈帧弹出时自动清理。
    Objective-C将堆内存管理抽象出来了。不需要malloc和free来分配或者释放对象所占内存。Objective-C运行期环境把这部分工作抽象为一套内存管理架构,明叫“引用计数”。
    在Objective-C代码中,有事会遇到定义里不含* 的变量,他们可能会使用“栈空间”(stack space)。这些变量所保存的不是Objective-C对象。比如CoreGraphics框架中的CGRect:

    CGRect frame;
    frame.origin.x = 0.0f;
    frame.origin.y =10.0f;
    frame.size.width = 100.0f;
    frame.size.height = 150.0f;
    

    CGRect是C结构体,其定义为:

    struct CGRect {
    	    CGPoint origin;
        CGSize size;
    }
        typedef struct CGRect CGRect;
    

    整个系统框架都在使用这种结构体,因为如果改用Objective-C对象来做的话,性能会受影响。与创建结构体相比,创建对象还需要额外的开销,例如分配以及释放堆内存等。如果只需要保存int/float/double/char等非对象类型,那么通常使用CGRect这个种结构体就可以了。

    要点

    • Objective-C为C语言添加了面向对象的特性,是其超集。Objective-C使用动态绑定的消息结构,也就是说,在运行时才会检查对象类型。接收一条消息之后,究竟应执行何种代码,由运行期而非编译器决定。
    • 理解C语言的核心概念有助于写好Objective-C程序。尤其要掌握内存模型与指针。
  • 相关阅读:
    node express 上传文件
    [Java] 对象转型-01
    [Java] 类的Equals方法 (String, Data类都已经自动重写)
    editor does not contain a main type" 错误解决方
    Ubuntu网络连接图标消失解决方法
    [面试] 从尾到头打印链表-递归实现
    C++继承的例子 (1)
    国内访问gmail
    [python] 第7章 函数 第8章 模块
    Devcpp(Dev C++)使用说明及技巧
  • 原文地址:https://www.cnblogs.com/zhanggui/p/4677934.html
Copyright © 2011-2022 走看看