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



苹果公司的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





本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dongfengsun/archive/2009/07/19/4361730.aspx

iPhone开发初探的更多相关文章

  1. Unity3D游戏开发初探—2.初步了解3D模型基础

    一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...

  2. iPhone开发与cocos2d 经验谈

    转CSDN jilongliang : 首先,对于一个完全没有mac开发经验,甚至从没摸过苹果系统的开发人员来说,首先就是要熟悉apple的那一套开发框架(含开发环境IDE.开发框架uikit,还有开 ...

  3. iOS开发UI篇—iPad和iPhone开发的比较

    一.iPad简介 1.什么是iPad 一款苹果公司于2010年发布的平板电脑 定位介于苹果的智能手机iPhone和笔记本电脑产品之间 跟iPhone一样,搭载的是iOS操作系统 2.iPad的市场情况 ...

  4. iPad和iPhone开发区别

    原文:http://mobile.51cto.com/iphone-273895.htm iPad与iPhone 开发区别详解是本文要介绍的内容,先来看看他们的区别. 1.首先我们先从官方发布的SDK ...

  5. iPhone开发视频教程 Objective-C部分 (51课时)

    第一.二章  OC基础语法 iPhone开发教程 第一章 OC基础语法  iPhone开发概述-必看(1.1)http://www.apkbus.com/android-102215-1-1.html ...

  6. 【汇总】涉及iOS&iPhone开发相关文章汇总

    此文章汇总本博客中有涉及iPhone开发的相关文章,不定时更新中... 1.NSUserDefaults快速存储数据: http://www.cnblogs.com/ios-wmm/archive/2 ...

  7. iPhone开发常问的十个问题

    iPhone开发常问的十个问题 前言 今天去stackoverflow.com上看了一下iPhone标签下排名最高的10个问题,将它们整理出来,希望这些常见问题能帮到一些iPhone开发的初学者.本来 ...

  8. iOS开发教程之:iPhone开发环境搭建

    安装条件: 硬件:一台拥有支持虚拟技术的64位双核处理器和2GB以上内存的PC. 注意:运行MAC OS,需要电脑支持虚拟技术(VT),安装时,需要将VT启动,在BIOS中开启. 软件: Window ...

  9. iOS:iPad和iPhone开发的异同(UIPopoverController、UISplitViewController)

    iPad和iPhone开发的异同 1.iPhone和iPad: niPhone是手机,iPad.iPad Mini是平板电脑 iPhone和iPad开发的区别 屏幕的尺寸 \分辨率 UI元素的排布 \ ...

随机推荐

  1. 【ShaderToy】水彩画

    写在前面 好久没有更新shadertoy系列了,我万万没想到有童鞋还惦记着它...之前说过希望可以一周更新一篇,现在看来是不怎么可能了,一个月更新一篇的希望比较大(不要再相信我了...) 我把之前实现 ...

  2. Java基础---Java---网络编程---TCP的传输、客户端和服务端的互访、建立一个文本转换器、编写一个聊天程序

    演示TCP的传输的客户端和服务端的互访 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息. 客户端: 1.建立Socket服务,指定要连接方朵和端口 2.获取Socket流中的输出流,将数 ...

  3. Simple tutorial for using TensorFlow to compute polynomial regression

    """Simple tutorial for using TensorFlow to compute polynomial regression. Parag K. Mi ...

  4. 漫谈android系统(4)bring up panel

    点击打开链接 版权声明: 作者:alex wang 版权:本文版权归作者和CSDN共有 转载:欢迎转载,为了保存作者的创作热情,请按要求[转载],谢谢 要求:未经作者同意,必须保留此段声明:必须在文章 ...

  5. J2EE学习从菜鸟变大鸟之七 Servlet

    Servlet现在自己的理解是一个控制器,简单的可以理解为不同的JSP页面由用户发送过来的请求可以由Servlet控制器来控制其向下调用的方向(结合三层好理解),但它比较特殊,因为它通常会从外界接收数 ...

  6. UNIX环境高级编程——记录上锁(fcntl函数)以及死锁检测

    一.记录锁 record locking 功能:当一个进程正在读或修改文件的某个部分时,它可以阻止其它进程修改同一文件区. 字节范围锁 byte-range locking 二.历史 flock函数, ...

  7. 【OpenCV文档】用于角点检测的Fast算法

    原文地址:http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_fast/py_fast.html#fast-algorithm- ...

  8. 【Android 系统开发】 Android 系统启动流程简介

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3889548 ...

  9. OC语言(七)Block复习

    看下面一道Block的面试题: int i = 10; void(^myBlock)() = ^{ NSLog(@"%d",i); }; i = 100; myBlock(); 经 ...

  10. C++ Primer 有感(复制控制)

    1.不管类是否定义了自己的析构函数,编译器都 自动执行类中非static数据成员的析构函数. 2.如果我们没有定义复制构造函数,编译器就会为我们合成一个.合成复制构造函数的行为是,执行逐个成员初始化, ...