Effective Objective-C 2.0 — 第14条:理解“类对象“的用意

  • 每个实例都有一个指向Class 对象的指针,用以表明其类型,而这些 Class 对象则构成了类的继承体系。
  • 如果对象类型无法在编译期确定,那么就应该使用类型信息查询方法来探知。
  • 尽量使用类型信息查询方法来确定对象类型,而不要直接比较类对象,因为某些对象可能实现了消息转发功能。

类型 id 能指代任意的Objective-C 对象类型,编译器假定 类型为 id 的对象 能响应所有消息

Objective-C 对象的本质

每个 Objective-C 对象实例都是指向某块内存数据的指针。,所以在声明变量时,类型后面要跟一个”*“字符

NSString *pointerVariable = @"Some string";

id 本身已经是 指针了

id genericTypedString = @"Some string";

描述Objective-C 对象所用的数据结构定义在运行期程序库的头文件里,

typedef struct objc_object [

Class isa;

} *id;

typedef struct objc_class *Class;

struct objc_class {

Class isa;

Class  super_class;

const char *name;

long version;

long info;

long instance_size;

struct objc_ivar_list *ivars;

struct objc_method_list **methodLists;

struct objc_cache *cache;

struct objc_protocol_list *protocols;

};

此结构体存放类的“元数据”(metadata)。

类对象所属的类型,即isa指针所指向的类型,叫做“元类”(metaclass)。

用来表述类对象本身所具备的元数据。

“isMemberOfClass:”能够判断出对象是否为某个特定类的实例。

“isKindOfClass:”能够判断对象是否为某类或其派生类的实例。

比较类对象是否等同。一般用 == 操作符,而不用“isEqual:”。

因为类对象是“单例”,在应用程序范围内,每个类的class仅有一个实例。

但是最好还是使用类型信息查询方法。而不应该直接比较两个类对象是否等同。

因为牵着可以正确处理那些使用了消息传递机制的对象。比方说:

某个对象可能会把其收到的所有选择子都转发给另一个对象。

这样的对象叫做“代理”(proxy),此种对象均以NSProxy为根类。

通常情况下,在此种代理对象上调用class方法,那么返回的是代理对象本身。而非接受的代理的对象所属的类。

若是使用类型信息查询方法,那么代理对象就会把这条消息转给“接受代理的对象”。

时间: 2024-12-25 18:47:29

Effective Objective-C 2.0 — 第14条:理解“类对象“的用意的相关文章

Effective Objective-C 2.0 — 第12条:理解消息转发机制

11 条讲解了对象的消息传递机制 12条讲解对象在收到无法解读的消息之后会发生什么,就会启动“消息转发”(message forwarding)机制, 若对象无法响应某个选择子,则进入消息转发流程. 1,通过运行期的动态方法解析功能,可以在需要用到某个方法时再将其加入类中. 2,对象可以把其无法解读的某些选择子转交给其他对象来处理. 经过上述两步之后,如果还是没办法处理选择子,那就启动完整的消息转发机制. 动态方法解析 对象在收到无法解读的消息之后,首先调用其所属类的下列类方法 + (BOOL)

NVIDIA DIGITS 学习笔记(NVIDIA DIGITS-2.0 + Ubuntu 14.04 + CUDA 7.0 + cuDNN 7.0 + Caffe 0.13.0)

转自:http://blog.csdn.net/enjoyyl/article/details/47397505?from=timeline&isappinstalled=0#10006-weixin-1-52626-6b3bffd01fdde4900130bc5a2751b6d1 NVIDIA DIGITS-2.0 + Ubuntu 14.04 + CUDA 7.0 + cuDNN 7.0 + Caffe 0.13.0环境配置 引言 DIGITS简介 DIGITS特性 资源信息 说明 DIGI

html5体验优化页面加载的14条建议

html5体验优化页面加载的14条建议 1. fake 页 - 首屏加速目标:首屏 3s 以内因为 71% 的用户期望移动页面跟 pc 页面一样快 (3s) ,74% 的用户能容忍的响应时间为 5 秒,所以我们必须保证移动端页面有足够的速度. 方案:- 避免页面长时间白页,页面渲染只需要完整的HTML 以及 CSS- 加载结束后页面第一屏便渲染结束,然后再异步加载js- 静态资源不使用 cookie- 优化加载顺序 css头.js尾 2. 降低请求「数」- 将可合并的 CSS.JS 文件合并-

网站前端网页优化的原则(雅虎14条)

内容再丰富的网站,如果慢到无法访问也是毫无意义的:SEO做的再好的网站,如果搜索蜘蛛抓不到也是白搭:UE设计的再人性化的网站,如果用户连看都看不到也是空谈. 所以,网页的效率优化绝对是最值得关注的方面,那么,我们该如何才能提高一个网页的效率呢?对此,我今天就在马海祥博客上为大家分享一下雅虎网页优化的14条原则,也被称为:雅虎十四条,而这些原则也是我们作为一名SEO人员所必须了解的. 1.减少HTTP请求次数 据统计,有80%的最终用户响应时间是花在前端程序上,而其大部分时间则花在各种页面元素,如

雅虎Yahoo 前段优化 14条军规

Yahoo 14条 雅虎十四条 腾讯前端设计的Leader推荐我背熟的.请大家都能好好学习,不要像我一样一扫而过,好好的记下来!不仅仅是晓得一些CSS xhtml就好了,深刻认识到很多的东西需要学习的.很早就用Firebug,但是却没听说过Yslow,这叫不喜欢追求.希望大家关注前端设计的,多追求. 有兴趣的同学可以装个 Firebug 下的 Yslow ,测试下自己的网站. Web 应用性能优化黄金法则:先优化前端程序 (front-end) 的性能,因为 这是 80% 或以上的最终用户响应时

(转)高性能网页开发的14条军规

http://www.csharpwin.com/dotnetspace/12250r548.shtml 互联网已经越来越成为人们生活中不可或缺的一部分.ajax,flex等等富客户端的应用使得人们越加“幸福”地体验着许多原先只能在C/S实现的功能.比如Google机会已经把最基本的office应用都搬到了互联网上.当然便利的同时毫无疑问的也使页面的速度越来越慢.自己是做前端开发的,在性能方面,根据yahoo的调查,后台只占5%,而前端高达95%之多,其中有88%的东西是可以优化的. 以上是一张

14条最佳JS代码编写技巧

http://gaohaixian.blog.163.com/blog/static/123260105201142645458315/写任何编程代码,不同的开发者都会有不同的见解.但参考一下总是好的,下面是来自Javascript Toolbox发布的14条最佳JS代码编写技巧,Sofish翻译(1,2). 1. 总是使用 ‘var’ 在javascript中,变量不是全局范围的就是函数范围的,使用”var”关键词将是保持变量简洁明了的关键.当声明一个或者是全局或者是函数级(function-

sudo: effective uid is not 0, is sudo installed setuid root

当普通用户需要临时使用root权限的时候需要执行sudo命令,但是在执行sudo命令的时候需要使用root的权限去执行/usr/bin/sudo二进制文件. 如果报错出现sudo: effective uid is not 0, is sudo installed setuid root 证明/usr/bin/sudo文件没有设置s权限(用户在执行文件的时候,临时拥有文件所有者的权限.) 解决方法: chmod u+s /usr/bin/sudo 加上权限之后再查看文件 ll  /usr/bin

iOS开发——技术精华Swift篇&Swift 2.0和Objective-C2.0混编之第三方框架的使用

Swift 2.0和Objective-C2.0混编之第三方框架的使用 swift 语言是苹果公司在2014年的WWDC大会上发布的全新的编程语言.Swift语言继承了C语言以及Objective-C的特性,且克服了C语言的兼容性问题.Swift语言采用安全编程模式,且引入了多种新功能,使得编程工作更加简便,灵活! 2015年6月9日苹果又一次给所有开发之者带来了一个惊喜,那就是今年年底swift讲开源,者队iOS开发着来说无疑是一个值得兴奋的消息,可是就在这短短的几个月里面swift吸引了越来