第一条:了解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实例的内存地址。



此图片内存布局演示了一个 分配在堆中的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程序。尤其要掌握内存模型与指针。

第一条:了解Objective-C语言的起源的更多相关文章

  1. Effective Objective-C 2.0 — 第一条:了解Objective-C语言的起源

    第一条: 了解Objective-C语言的起源 由Smalltalk演化而来,消息型语言的鼻祖(messaging structure)而非 (function calling)函数调用 //Mess ...

  2. 第1条:了解Objective-C 语言的起源

    1.OC语言是由Smalltalk演化而来.该语言使用“消息结构” 而 非“函数调用”. 使用“消息结构”的语言,其运行时所执行的代码由运行环境来决定: 编译器不需要关心接收消息的对象是什么类型,只在 ...

  3. 第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法

    第一章 熟悉Objective -C   编写高质量iOS与OS  X代码的52 个有效方法   第一条: 了解Objective-C 语言的起源 关键区别在于 :使用消息结构的语言,其运行时所应执行 ...

  4. 1.2《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——开始第一条命令

    现在开始准备运行我们的第一条命令了,在屏幕上打印'hello'.(字符打印的地方被称为'标准输出',通常指的是屏幕,很少指真的物理打印机设备).这条命令就是echo,这条命令的参数是想要输出的字符串或 ...

  5. 【网络爬虫入门01】应用Requests和BeautifulSoup联手打造的第一条网络爬虫

    [网络爬虫入门01]应用Requests和BeautifulSoup联手打造的第一条网络爬虫 广东职业技术学院 欧浩源 2017-10-14  1.引言 在数据量爆发式增长的大数据时代,网络与用户的沟 ...

  6. 教你用Elastic Search:运行第一条Hello World搜索命令

    摘要:Elastic Search可实时对数据库进行全文检索.处理同义词.从同样的数据中生成分析和聚合数据. 本文分享自华为云社区<Elastic Search入门(一): 简介,安装,运行第一 ...

  7. Oracle 查询出来的数据取第一条

    Oracle 查询出来的数据取第一条 --------------------------------------------------------------------------- 转载自:h ...

  8. oracle分组后取每组第一条数据

    数据格式: 分组取第一条的效果: sql语句: SELECT * FROM ( ;

  9. MSSQL 分组后取每组第一条(group by order by)

    查询中经常遇到这种查询,分组后取每组第一条.分享下一个SQL语句: --根据 x 分组后.根据 y 排序后取第一条 select * from ( select ROW_NUMBER() over(p ...

随机推荐

  1. SQL 必知必会·笔记<2>检索和排序数据

    1.检索数据 使用SELECT 检索表数据,必须至少给出两条信息——想选择什么, 以及从什么地方选择. 检索不同的值 使用DISTINCT关键字,检索不同的值,使用示例: SELECT DISTINC ...

  2. Spring Boot Actuator监控应用

    微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的处理和传递,出现了异常如何快速定位是哪个环节出现了问题? ...

  3. Quartz.NET的简单任务管理类

    昨天使用Quartz.NET做了个定时任务的功能,并实现了多个定时任务的功能 下面这个类实现了如下功能: 1.对定时任务进行管理 2.创建定时任务,需要给定时任务一个job的名称 3.判断给定的job ...

  4. window7环境下ZooKeeper的安装运行及监控查看

    原文:http://www.cnblogs.com/RainAndWind/p/4668427.html ZooKeeper是一个分布式开源框架,供了协调分布式应用的基本服务.这些天在使用DUBBO, ...

  5. 前端错误监控,sentry入门配置详细教程

    一.前言 最近经理说要把公司项目结合sentry用起来,然后组长不想做,老员工也不想做,分配任务就这么分配给我了,很荣幸接锅,摸索了几天,了解了一些基本配置,深一点的玩法可能还得实践一段时间,这里对于 ...

  6. 基于vue2.0实现仿百度前端分页效果(一)

    前言 最近在接手一个后台管理项目的时候,由于之前是使用jquery+bootstrap做的,后端使用php yii框架,前后端耦合在一起,所以接手过来之后通过vue进行改造,但依然继续使用的boots ...

  7. 关于wepack的使用总结以及优化探讨

    一.前言 不知不觉,webpack版本已经到4.0了.使用它也有很长一段时间了,回头看看,自己木有总结webpack方面的知识,现在有空起个头,主要是总结自己常用的配置和一下优化的探讨,以后有啥想法也 ...

  8. Bootstrap-table 使用总结

    一.什么是Bootstrap-table? 在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这 ...

  9. [译]Node.js框架对比:Express/Koa/Hapi

    本文翻译自: https://www.airpair.com/node.js/posts/nodejs-framework-comparison-express-koa-hapi 1.介绍 直至今日, ...

  10. Java的第6天,学习运算符

    提到运算符我们就会想起 加 减 乘 除: Java中的一些运算符:关系运算符.逻辑运算符.赋值运算符.和条件运算符: 其中算术运算符有:+ , - , * , \, % ,++, -- ; + , - ...