第一条:了解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. Spring Security OAuth笔记

    因为工作需要,系统权限安全方面可能要用到Spring Security OAuth2.0,所以,近几天了解了一下OAuth相关的东西.目前好像还没有系统的学习资料,学习主要是通过博客,内容都是大同小异 ...

  2. SQL 必知必会·笔记<3>过滤数据

    在同时使用ORDER BY 和WHERE 子句时,应该让ORDER BY 位于 WHERE 之后,否则将会产生错误 WHERE子句操作符 范围值检查 使用BETWEEN 操作符,示例: SELECT ...

  3. Android 监听 ScrollView 滑动到最底部。

    做产品时,有一个需求,需要监听ScrollView滑动到最底部.在网上找了些方法,都有这样或那样的问题,要不就是监听不精确, 要不就是重复监听,那些代码没有产品化,很不可靠. 经过自己试验,终于找到了 ...

  4. Java基础之Java 修饰符

    前言:Java内功心法之Java 修饰符,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) Java语言提供了很多修饰符,主要分为以下两类: 访 ...

  5. IP白名单添加了当前IP,获取access_token时依然报出错误码40164的坑

    开发公众号网页时,想要调用微信API接口,令人无奈的是,想要调用各接口都需使用access_token,于是,获取access_token的征途开始了…… 1.开发者基本配置 (1) 公众平台官网登录 ...

  6. 【学习笔记】JS经典异步操作,从闭包到async/await

    参考文献:王仕军——知乎专栏前端周刊 感谢作者的热心总结,本文在理解的基础上,根据自己能力水平作了一点小小的修改,在加深自己印象的同时也希望能和各位共同进步... 1. 异步与for循环 抛出一个问题 ...

  7. Gulp Error: Cannot find module 'jshint/src/cli'

    I'm following sitepoint's An introduction to Gulp.js, but I'm stuck on step four, when I try to run  ...

  8. 《SQL Server从入门到精通》

    书名 <SQL Server从入门到精通> 图片 时间 2017-6月 学习 书还可以看完不痛不痒 光盘里面是c的视频有趣这是要我学c的节奏啊,可以写一些基础sql语句也是一门语言叫T-s ...

  9. Sublime Text3 远程 Linux

    ctrl+shift+p快捷键 ,打开命令面板 搜索命令 Install Packages,选中,Enter 稍等几秒,重新出现了面板,搜索sftp插件,选中 Enter 显示安装成功,提示你如何使用 ...

  10. tomcat版本号隐藏或修改

    tomcat版本号隐藏或修改 找到tomcat\lib\catalina.jar\org\apache\catalina\util\ServerInfo.properties文件 修改 server. ...