Android 4.2新特性体验
昨晚在我的Galaxy Nexus和Motorola Xoom上得到系统更新的消息,可以把手机升级到了最新的4.2系统。记得两年前,我刚用Android系统的HTC Aria手机,那部的系统版本还只是2.1,而且两年里从来没有去升级也没有刷过机。因为不方便,现在Android的设备升级已经变得便捷。所以我也乐得去升级系统的版本。
经过一天在Nexus手机上的使用,感觉到新系统的更进一步提升的体验,但是也有一些变化让我不太能适应。
Read More →
昨晚在我的Galaxy Nexus和Motorola Xoom上得到系统更新的消息,可以把手机升级到了最新的4.2系统。记得两年前,我刚用Android系统的HTC Aria手机,那部的系统版本还只是2.1,而且两年里从来没有去升级也没有刷过机。因为不方便,现在Android的设备升级已经变得便捷。所以我也乐得去升级系统的版本。
经过一天在Nexus手机上的使用,感觉到新系统的更进一步提升的体验,但是也有一些变化让我不太能适应。
Read More →
用+(void)load对全局变量初始化,实际上并不是一个非常好应用,因为大多情况下我们并不需要使用全局变量。但是另一方面,我们倒是可以通过+(void)load
来实现对象关系映射(Object-relational mapping, ORM)的结构。
首先我们要定义一个ORM
类,它含有Dictionary成员。这个Dictionary用来保存我们要用来映射对象所属类的名字(作为key)和类本身(作为value)。
Read More →
《Objective C类方法load和initialize的区别》里,我介绍了+(void)initialize和+(void)load两个方法在编译和执行时出现的区别,又通过《使用Objective-C的+(void)initialize初始化static变量》一文简单介绍了+(void)initialize可以用在对静态变量的初始化上。
如同《使用Objective-C的+(void)initialize初始化static变量》中介绍的那样,假如Objective-C的全局变量被限定为static,只用在当前文档中,那么使用+(void)initialize
来进行初始化是非常合适而且正确的。如果类并未被使用,该变量就不会被赋予对象也就不会浪费内存空间。但是假如我们就是希望用全局变量在程序任何地方使用,那么+(void)initialize
可能就不那么有效了。因为变量可能在相应类的方法被调用前就使用,即是说+(void)initialize
并未被调用对全局变量进行初始化。
Read More →
在《Objective C类方法load和initialize的区别》一文中,我介绍了Objective-C对待+(void)initialize
和+(void)load
两个方法在编译和执行时出现的不同。而这些不同也是在使用时应该非常注意的地方。不过文章里面我没有讲这两个方法在Objective-C中究竟有什么实用价值。
其实+(void)initialize
可以视为C#,Java中的静态构造函数。有了这个方法,我们就不用像C++自己另找途径来设计静态构造函数了。不过Objective-C中又有一些很不同的地方,因为Objective-C里不能把数据成员限定为static或者const。也就是说,虽然Objective-C可以定义类方法,但是类不能有数据成员。所以也不存在静态数据成员初始化的问题。
不过作为C语言的超集,Objective-C依然可以沿用C的一些特点了定义static的全局变量来作为类静态成员。
Read More →
过去两个星期里,为了完成一个工作,接触到了NSObject中非常特别的两个类方法(Class Method)。它们的特别之处,在于iOS会在运行期提前并且自动调用这两个方法,而且很多对于类方法的规则(比如继承,类别(Category))都有不同的处理。
而因为这两个方法是在程序运行一开始就被调用的方法,我们可以利用他们在类被使用前,做一些预处理工作。比如我碰到的就是让类自动将自身类名保存到一个NSDictionary中。
在《二分查找法的实现和应用汇总》中,我介绍了二分查找法的基本应用,不过在面试的准备过程中,我还碰到了更多对于二分查找法的更进一步的使用。其实在《二分查找法的实现和应用汇总》的最后,我已经介绍了一个非常规的使用,也就是基于“轮转后的有序数组(Rotated Sorted Array)”检查某一个数是否存在。
在此篇文章中,我将进一步介绍更多我碰到的一些二分查找法的应用。
Read More →
引用类型(Reference)在许多计算机语言中都被使用,而且是作为一个非常强大而实用的特性存在。它有类似指针(Pointer)的实现,却又有不同于指针的表现。例如C++的引用,可以让不同变量指向同一个对象,同时又保有直接使用dot来获取对象成员,不用繁琐的使用dereference运算符(*)和Pointer to Member运算符(->)。Java和C#中就直接以引用为主要类型,尽量让开发人员避免使用指针。
PHP中也引入了引用类型,在对对象赋值传递上,基本可视为是同于Java/C#的引用传递(具体请见Objects and references)。但同时又支持在基础类型上通过引用运算符(&)来获得内容的引用。不过在实际的使用中,PHP的引用类型因为整个PHP设计结构而存在着许多的问题,使得在程序出现非预计的结果。Read More →
古语“画虎画皮难画骨”,是说画老虎时要画它的外表很容易,可要将老虎的气势画出来却很难。
对于现在的程序员来说,似乎也是这样子,可以写出整洁的代码,设计出优异的程序,但却不一定需要知道代码在编译之后的是如何运行的。
但是有时候,能了解表面背后的故事,知道一些程序编译过程,其实对写出一个正确的正确的程序会有很大的帮助,这起源自一段很简单的问题实现:两整数交换。
Read More →
这是一道关于字符串的操作的问题,一开始思考的时候,感觉需要取出各种不同的子序列,如果是这样时间复杂度就会变成指数级别。不过在朋友的指示下,发现其实它是有规律可寻的,最后的算法时间负责度只要O(n),而且代码极其简单。
虽然朋友是直接告诉了我其中的规律,但是我还是花了点时间思考和证明了一下,才放心的写下了代码。现在把它总结在这里。
整个问题的证明基本是使用数学归纳法,以及奇数和偶数的一些性质。感叹数学的世界真奇妙。也庆幸自己一直以来我十分喜欢数学。其实计算机的世界本来就是建立在各种数学理论之上,比如离散数学,模糊数学,逻辑数学。但是计算机又让数学的应该变得更加的广阔。
(你可以在看完题之后直接跳到红色的部分看这个问题的结论。)
Read More →
在《C++的头文件和实现文件分别写什么》文章中,我对于的C++的数据成员,逐个分析了可以作用在它们上边的限定符都有哪些,以及它们所对应的进行初始化的位置。可以看出这些修饰符其实就是const和static的两种的组合,但是却有不同的效用。
本文,我想讲关于static的问题,《C++的头文件和实现文件分别写什么》已经指出如果数据成员被声明为static,那么它在编译时就必须被初始化。仅含static的则放在类之外,实现文件之中;同时含有的const的则放在类之内,直接跟在数据的定义之后。
在我实际代码编写中碰到的问题是:static成员的初始化比较的复杂,步骤较多,需要调用另一个函数来完成。此时,简单使用赋值语句就不太能完成那些目的了。
Read More →