读Effective Objective C总结(三)

  1. 在collection集合类中如NSSet中是不允许有相同的元素的,但是如果这样写:

    这样就会第一个set的输出结果是两个相同的元素,第二个set的输出结果只有一个元素

  2. 类族模式:由于在OC中没有抽象基类,因此用工厂模式,比如我们可以用创建UIButton类似的方法:判断某个实例所属的类是否在类族之中,要用isKindOfClass不能用isMemeberOfClass,因为有些类会有内部类型
  3. 关联对象的使用,实际上就是在局部空间建立一个通道来共享某些类,如在UIAlert里面共享block
  4. 消息是由接受消息的对象和函数指针构成的,若是没有用到runtime,编译器生成函数代码的指令是硬编码,如果用到动态绑定:

    第一,先要用@dynamic关键字修饰需要动态生成的属性,然后重写类的resolveInstanceMethod方法

    第二,如果第一步还是没有找到合适的方法,就会调用forwardingTargetForSelector方法转发给其他对象,一直执行到NSObject

    第三,如果第二步还没有成功,就要启动完整的消息转发机制,首先创建NSInvocation对象,把尚未处理的消息信息全部封装在这个对象里

  5. 可以通过方法调换的方式,改变objc_msgSend中函数列表中IMP的指针
  6. OC对象实际上使用结构体和指针来构造的,用isMemberOfClass判断是否为某一特定类的实例,用isKindOfClass判断是否为其类或者派生类的实例,而不要用[A Class] == [B Class]
时间: 2024-10-12 07:58:38

读Effective Objective C总结(三)的相关文章

读Effective Objective C总结(二)

OC编译器的特性:在声明成员变量时,编译器会产生一个硬编码的偏移量,它表示变量距离存放该对象的内存区域的起始地址的长度.OC把这个偏移量作为类对象的一个特殊变量,在runtime时期查找,就总可以生成正确的偏移量. @property 属性:在没有进行任何手动操作的前提下,这个属性第一自动生成了getter和setter方法,同时生成了对应属性"_字段"的成员变量 @property中内存管理的语义: 4.关于使用点语法的原则:在初始化方法或者dealloc中,要用成员变量,不要用点语

读Effective Objective C总结(一)

第一章 Objective C是一种基于消息结构的语言,在查找执行的方法和对象时是在运行时处理 对象的空间分配在堆空间,指向对象的指针分配在栈空间,基本数据类型和结构体也分配在栈空间 在引入头文件时,尽量使用@Class前向声明来提高编译效率 多使用字面量语法,但是在取下标的时候,要注意是否有意义 少使用#define预处理指令,若要在一个文件(当前单元)里使用静态常量,应该这样声明:static const NSTimeInterval kTime,但是这种方法并不能用OC的方法初始化,即必须

Effective C++(第三版)笔记 ---- 第一部分让自己习惯C++

内容从侯捷译版的<Effective C++>(第三版)摘录 条款一 C++作为一个多种范式融合的语言,可以看成是语言的联邦,它包含了一下四种主要的次语言: C.C++以C为基础,很多时候C++对于问题的解法其实不过就是较高级的C解法,但是C语言的局限:没有模板,没有异常处理,没有重载. OO C++.包括类,封装,继承,多态,动态绑定. Template C++. 这是C++范型的部分. STL.包括三个主要部分.容器(containers),迭代器(iterator),算法(algorit

读ActiveAndroid源码(三)

上一章,我们读完了Conguration这个类.最后我们发现,Conguration就是为了数据库的初始化.其中包含了内存大小.数据库名称.数据库版本.parser信息. public static synchronized void initialize(Configuration configuration) { if (sIsInitialized) { Log.v("ActiveAndroid already initialized."); return; } sContext

逻辑读时的cbc latch(三)

继续验证使用索引时,cbc latch相关情况,使用solaris中的dtrace 编写dtrace脚本 more cbc.d #!/usr/sbin/dtrace -s -n  char *memnr; int latchaddr; dtrace:::BEGIN {         i=1;         latchaddr=0; } pid$1::sskgslcas:entry {         memnr=copyin(arg0,12);         latchaddr=arg0;

读C#程序(第三周)

阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间精确到分钟(电脑:单核CPU 4.0G Hz,内存和硬盘等资源充足). 问题4:在多核电脑上如何提高这一程序的运行效率? (注:该程序.用C#语言编写,但是只要有C语言基础完全没有阅读压力,如果对部分语句不懂请自行查询) 要求:将上述问题结果写到博客上. using System; using Sy

再读大道之简第三章

团队缺乏的不只是管理 书里这么说. 首先一个人算不得团体,那就是个体.两个人则互相支撑,古文中“从”字是二人互利就是这个意思.然而两人互利并不算团队,因为没有监督.三个人便可以构成团队,这样便有了团队的一些基本特性:主从.监督和责任. 其实我是第一次看这段的时候,是十分赞同这段话的,甚至有些佩服.我们很多时候指导我们是个TEAM,但是不知道到底多少人可以构成一个TEAM,甚至不知道团队里有什么关系.可是现在看看也不完全正确,或者准确的说,团队是至少有三个人的,并且团队有主从.监督.责任三个基本特

读大道至简第三章感想

大道至简第三章介绍的是关于团队的问题.首先说明了什么是团队,至少是三个人的队伍才称得上是团队.对于团队就会存在领导者,作为领导者能力很重要的,但是并不意味着能力出众就可以成为领导者.就像书中所说,一个员工在一次项目制作中完成了全部的核心代码,公司给予了他优厚的奖励,但是这并不意味着下一个项目就由他来领导.因为项目经理必须具备最基本的素质:承担责任.做项目不是要像程咬金一样只有能力而不会管理的人,而是要李离这样对于出错敢于担当的死士.作为一个项目经理你拿着经理的工资,凭什么出了问题要你的员工来背锅

读大道至简第三章有感

第三章的标题是 团队缺乏的不只是管理,作者以”言三人为众,虽难尽继,取其功尤高者一人继之於名为众矣.“这段<汉书>中的话来引出了团队的概念. 第一节的标题是三个人的团队,”言三人为众“团队至少是以三个人为规模的,如此便具备了团队的基本特性:主从.监督和责任.”取其功尤高者一人继之,於名为众“就是功高者代替群体受功,其意思就是功劳大的.能力强的便成了团队中的领导角色.做管理不仅要功劳大,做管理最基本的素质是要能承担责任.当项目失败后,要有乘受去.相应责任的能力. 第二节标题为”做项目=死亡游戏?