为什么iPhone那样热

其实这个问题和很多其它的无论是软件还是硬件来说,都拥有同一个道理,那就是让消费者可以“玩” 起来。

从开放源码的流行开始,消费者“玩” 的心态就被越来越淋漓尽致地发掘了出来。

有一个小事件,有个开发者利用开源软件,可以把原来功能本以挺强的Linksys路由器的固件做了升级,从而提供了一些商用入门级路由器才具有的功能,并且 给了用户更多配置的选择。刚开始只能应用在特定的硬件版本的Linksys路由器上,而且用户要冒着损坏硬件设备无法挽救的经济损失的危险。大家可能可以 想像,现在这个社区已经成长相当的程度,不仅程序被扩展到了其它型号的设备,而且其它品牌的也可以使用;不仅是软件逐步被客户强壮流行,而且 Linksys的几款路由器被疯抢,现在已经几乎在市场上买不到了,即便有价格也很高,而Linksys犯了一个战略错误,为了所谓的商业利益居然停止生 产该系列了,这是后话。随着该软件可以兼容的产品增多,那些被兼容的硬件设备,就成了市场上的热销货( 可以参考Tomato和DD-WRT, x-WRT等)。

在 iPhone之前有一种叫做HTC的智能手机产品PDA,它有自己的产品线,有自己的手机系统,有自己的应用程序,但是它之所以在众多手机产品中脱颖而出 的,不是它提供了什么别人无法提供的功能,而是有人破解了它的系列手机,可以实现升级,挖掘更多的该手机的功能,添加自己的程序,把其它的软件转移到它上 面运行, 所以,现在提到智能手机,一个是BlueBerry, 一个是iPhone,还有就是HTC, 后起之秀的Google G1,微软等的,要看他们是否愿意参加这个“玩”的游戏了. 而那些传统的手机厂家的设备,迟早会被这些更可以”玩”的取代. (参考XDA-Developers等)

再说iPhone,你知道iPhone*初的成功很大程度上在于它的外观上,而作为可以持续保持热度的还在于,它可 以让用户”玩”起来。大家都知道iPhone的销售策略是,你加入某个电信提供商才能买到可以当电话使用的iPhone,这一点好像看上去苹果把自己局限 在很小的用户方位之内,但是事情却因为一个破解而给广大的用户一个希望,该破解接触了只能绑定在一个电信提供商的加密技术,这样用户可以随便加入其它的电 信商。

再看看操作系统iPhone 3.0,它免费,它继承了先哲的功能,并更强大,但是实际上它不仅提供了用户可以在其上开发应用软件/游戏的能力,而且给用户更多的”玩”的可能。

大家想想,如果当初计算机的硬件和软件总是绑在一起的,没有所谓的操作系统的独立出来,更没有后来操作系统和应用系统的分开,那么计算机能够发展到现在家喻户晓每人口渴以拥有也都愿意拥有的广阔的市场吗?

当然了,并不是说一个产品可以让用户”玩”起来,就一定占有了市场,但是,就目前的市场来说,这的确是一个聚集客户人气和让市场自我保持持续热度的手段。

有的人依据iPhone现在才实现了人家厂商很早前就有的功能,诸如Copy/Paste等,来判断iPhone没有前途,那未免有点只看外表,没有看到当今市场的发展的内在规律了。

让市场决定谁将留下来,谁将领头吧。

iPhone开发初探

Author:孙东风   Date:07/19/2009

 

本文是作者从一无所知到入门的知识学习过程,并结合自己在嵌入式开发的经验所写的技术总结文章,以供后来者学习。

 

苹果公司的iphone平台采用Object-c做为native language的开发,Object-c的内核是C语言的,并基于C语言实现OOP的一些特性。Object-c是对C语言的扩展,这和C++的前身Better-c有很大的相似之处,Object-c的新版本里实现了和Java类似的垃圾回收机制,但基于iphone平台的资源限制,iphone平台并不支持垃圾回收机制。

 

学习一门语言,自然要从”词法分析”也即编译前端和”语法分析”也即编译后端来理解它。

 

在编译前端,Object-c给我们带来了很多不一样的特性。下面我们重点看看Object-c与众不同的词法定义。

 

1.Object-c使用.m后缀作为代码文件的扩展名,当然你也可以使用.c和.cpp后缀名,但它们会分别调用C compiler和C++ compiler。Xcode作为iphone开发的集成环境,使用GCC作为编译器。

2.Object-c使用#import代替#include来导入声明文件。并且编译器保证#import不会被重复导入。

3.尽管Object-c也支持printf()进行控制台打印文本信息,但是更推荐使用NSLog(),并且它会自动在文本后面添加’/n’。

4.Object-c曾经也叫做NextStep,为了更好的体现其OOP的特性,NextStep里所有的对象都继承自NSObject,这点和Java的单根继承很类似。所以其Applicatio Kit里的类库前缀基本都是NS*。而其Cocoa Foundation里的类库前缀基本都为NSCF*。

5.Object-c提供了BOOL类型,但这个BOOL类型和C++里的并不一样,在C++里一切非0值的东西都为true,而为0值的为false。但是Object-c里1为true并被宏定义为YES,0为false并被宏定义为NO。

所以,如果读者写下面的代码,肯定是错误的:

 

BOOL areIntsDifferent_faulty(int thing1,int thing2)

{

return (thing1-thing2);

}

 

if(areIntsDifferent_faulty(23,5) == YES)

{

}

因为areIntsDifferent_faulty方法返回的是两个整数的差,如果这个差不为1,那么永远不会为YES。

6.Object-c里仍然继承了C语言的传统,其primitive type只有int、char、float、BOOL并用它们表达一切。

7.Object-c采用@interface来进行接口的声明,并采用@implementation对声明进行实现。

8.Object-c在Foundation Kit里提供了很多基础类库,常用的如NSString、NSRange、NSLog、NSPoint、NSRect等,这点和Symbian里提供的绘制接口很类似。

9.Object-c也支持Collection类库,并充分借鉴了Java Collection的设计,比如NSArray、NSMutableArray等。这些类库提供基本的插入、删除、排序操作,需要注意的是NSMutableArray才提供上述操作,而NSArray为不可修改的,这有点类似于Java的String和StringBuffer,而iphone里也提供了NSString和NSMutableString!

10.Object-c里采用跌代器的概念进行元素的遍历,NSEnumerator的典型用法如下:

NSEnumerator* enumerator;

enumerator = [array objectEnumerator];

 

id thingie;

while(thingie = [enumerator nextObject])

{

NSLog(@”I found %@”,thingie);

}

 

在编译后端,Object-c同样实现了OOP编程的特性:继承、多态、封装。下面逐一介绍。

1.继承

典型的继承用法如下:

@interface Circle : NSObject

{

ShapeColor fillColor;

ShapeRect  bounds;

}

 

-(void) setFillColor: (ShapeColor)fillColor;

-(void) setBounds: (ShapeRect)bounds;

-(void) draw;

@end //Circle

 

@interface Rectangle: NSObject

{

ShapeColor fillColor;

ShapeRect  bounds;

}

 

-(void) setFillColor: (ShapeColor)fillColor;

-(void) setBounds: (ShapeRect)bounds;

-(void) draw;

@end //Rectangle

 

上述两个类Circle、Rectangle的属性和行为非常类似,所以我们可以通过封装、继承的方法进行代码构造。如下:

 

@interface Shape: NSObject

{

ShapeColor fillColor;

ShapeRect bounds;

}

 

 

 

@implementation Shape

-(void) setFillColor:(ShapeColor)c

{

fillColor = c;

}

 

-(void) setBounds:(ShapeRect)b

{

bounds = b;

}

 

-(void)draw

{

 

}

@end //Shape

 

下面分别利用继承实现Circle和Rectangle,如下:

 

@interface Circle:Shape

@end //Circle

 

 

 

 

@interface Rectangle:Shape

@end //Rectangle

 

@implementation Circle

-(void) draw

{

NSLog(@”drawing a circle”);

}

 

@end //Circle

 

@implementation Rectangle

 

-(void) draw

{

NSLog(@”drawing a rectangle”);

}

@end //Rectangle

2.多态

Object-c利用[super Init]之类的语法调用父类的方法,每个类都有一个指向自己的self指针,这点和C++的隐含this指针是类似的。

Object-c并不支持多继承,因为多继承的开销过大,需要解决虚基类的问题。在大多数的嵌入式平台,比如Symbian上也不支持多继承。

3.内存管理

Object-c在内存管理上也采用大多数编译器所采用的reference counting技术,亦即编译器为每个对象维护一个引用计数,在这个引用计数为0时释放对象所占用的资源。

 

int main(int argc,const char* argv[])

{

RetainTracker *tracker = [RetainTracker new];

[tracker release];

return (0);

}

 

总结一下,iphone上的开发还是比Symbian简单的,因为apple公司毕竟是软件开发的专业公司,一些开发工具,比如Xcode远远比Symbian的Carbide.c++要好用。

 

-(void) setFillColor: (ShapeColor)fillColor;

-(void) setBounds: (ShapeRect)bounds;

-(void) draw;

@end // Shape