首页 > > > Objective-C 第一版.pdf

Objective-C 第一版.pdf

Objective-C 第一版.pdf

上传者: 96agan 2011-06-25 评分1 评论0 下载7 收藏10 阅读量454 暂无简介 简介 举报

简介:本文档为《Objective-C 第一版pdf》,可适用于手机软件领域,主题内容包含Translations:English|Chinese大纲l开始吧下载这篇教学设定环境前言编译helloworldl创建Classesinterf符等。

Translations:English|Chinese大纲l开始吧下载这篇教学设定环境前言编译helloworldl创建Classesinterfaceimplementation把它们凑在一起l详细说明多重参数建构子(Constructors)存取权限Classlevelaccess异常情况(Exceptions)处理l继承、多型(Inheritance,Polymorphism)以及其它对象导向功能id型别继承(Inheritance)动态识别(Dynamictypes)CategoriesPosingProtocolsl内存管理RetainandRelease(保留与释放)DeallocAutoreleasePoollFoundationFrameworkClassesNSArrayNSDictionaryl优点与缺点l更多信息开始吧o下载这篇教学n所有这篇初学者指南的原始码都可以由objctargz下载。这篇教学中的许多范例都是由SteveKochan在ProgramminginObjectiveC一书中撰写。如果你想得到更多详细信息及范例请直接参考该书。这个网站上登载的所有范例皆经过他的允许所以请勿复制转载。页码ObjectiveCBeginner'sGuidefile:C:DocumentsandSettingsAdministrator桌面ObjectiveCBegiPDFcreatedwithpdfFactoryProtrialversionwwwpdffactorycomo设定环境nLinuxFreeBSD:安装GNUStepn为了编译GNUstep应用程序必须先执行位于usrGNUstepSystemMakefilesGNUstepsh的GNUstepsh这个档案。这个路径取决于你的系统环境有些是在usr,someusrlib有些是usrlocal。如果你的shell是以cshtcsh为基础的shell则应该改用GNUStepcsh。建议把这个指令放在bashrc或cshrc中。nMacOSX:安装XCodenWindowsNTX:安装cygwin或mingw然后安装GNUStepo前言n这篇教学假设你已经有一些基本的C语言知识包括C数据型别、什么是函式、什么是回传值、关于指针的知识以及基本的C语言内存管理。如果您没有这些背景知识我非常建议你读一读KR的书:TheCProgrammingLanguage(译注:台湾出版书名为C程序语言第二版)这是C语言的设计者所写的书。nObjectiveC是C的衍生语言继承了所有C语言的特性。是有一些例外但是它们不是继承于C的语言特性本身。nnil:在CC你或许曾使用过而在ObjectiveC中则是nil。不同之处是你可以传递讯息给nil(例如nilmessage)这是完全合法的然而你却不能对如法炮制。nBOOL:C没有正式的布尔型别而在ObjectiveC中也不是「真的」有。它是包含在Foundationclasses(基本类别库)中(即importNSObjecthnil也是包括在这个标头档内)。BOOL在ObjectiveC中有两种型态:YES或NO而不是TRUE或FALSE。n#importvs#include:就如同你在helloworld范例中看到的我们使用了#import。#import由gcc编译器支持。我并不建议使用#include#import基本上跟h档头尾的#ifndef#define#endif相同。许多程序员们都同意使用这些东西这是十分愚蠢的。无论如何使用#import就对了。这样不但可以避免麻烦而且万一有一天gcc把它拿掉了将会有足够的ObjectiveC程序员可以坚持保留它或是将它放回来。偷偷告诉你Apple在它们官方的程序代码中也使用了#import。所以万一有一天这种事真的发生不难预料Apple将会提供一个支持#import的gcc分支版本。n在ObjectiveC中method及message这两个字是可以互换的。不过messages拥有特别的特性一个message可以动态的转送给另一个对象。在ObjectiveC中呼叫对象上的一个讯息并不一定表示对象真的会实作这个讯息而是对象知道如何以某种方式去实作它或是转送给知道如何实作的对象。o编译helloworldnhellom#import<stdioh>intmain(intargc,constchar*argv){printf("helloworldn")页码ObjectiveCBeginner'sGuidefile:C:DocumentsandSettingsAdministrator桌面ObjectiveCBegiPDFcreatedwithpdfFactoryProtrialversionwwwpdffactorycomreturn}n输出helloworldn在ObjectiveC中使用#import代替#includenObjectiveC的预设扩展名是m创建classesointerfacen基于"ProgramminginObjectiveC,"CopyrightbySamsPublishing一书中的范例并经过允许而刊载。nFractionh#import<FoundationNSObjecth>interfaceFraction:NSObject{intnumeratorintdenominator}(void)print(void)setNumerator:(int)d(void)setDenominator:(int)d(int)numerator(int)denominatorendnNSObject:NeXTStepObject的缩写。因为它已经改名为OpenStep所以这在今天已经不是那么有意义了。n继承(inheritance)以Class:Parent表示就像上面的Fraction:NSObject。n夹在interfaceClass:Parent{}中的称为instancevariables。n没有设定存取权限(protected,public,private)时预设的存取权限为protected。设定权限的方式将在稍后说明。nInstancemethods跟在成员变数(即instancevariables)后。格式为:scope(returnType)methodName:(parameterType)parameterNamenscope有class或instance两种。instancemethods以开头classlevelmethods以开头。nInterface以一个end作为结束。oimplementationn基于"ProgramminginObjectiveC,"CopyrightbySamsPublishing一书中页码ObjectiveCBeginner'sGuidefile:C:DocumentsandSettingsAdministrator桌面ObjectiveCBegiPDFcreatedwithpdfFactoryProtrialversionwwwpdffactorycom的范例并经过允许而刊载。nFractionm#import"Fractionh"#import<stdioh>implementationFraction(void)print{printf("ii",numerator,denominator)}(void)setNumerator:(int)n{numerator=n}(void)setDenominator:(int)d{denominator=d}(int)denominator{returndenominator}(int)numerator{returnnumerator}endnImplementation以implementationClassName开始以end结束。nImplement定义好的methods的方式跟在interface中宣告时很近似。o把它们凑在一起n基于"ProgramminginObjectiveC,"CopyrightbySamsPublishing一书中的范例并经过允许而刊载。nmainm#import<stdioh>#import"Fractionh"intmain(intargc,constchar*argv){createanewinstanceFraction*frac=FractionallocinitsetthevaluesfracsetNumerator:fracsetDenominator:printitprintf("Thefractionis:")页码ObjectiveCBeginner'sGuidefile:C:DocumentsandSettingsAdministrator桌面ObjectiveCBegiPDFcreatedwithpdfFactoryProtrialversionwwwpdffactorycomfracprintprintf("n")freememoryfracreleasereturn}noutputThefractionis:nFraction*frac=Fractionallocinitn这行程序代码中有很多重要的东西。n在ObjectiveC中呼叫methods的方法是objectmethod就像C的object>method()。nObjectiveC没有value型别。所以没有像C的Fractionfracfracprint()这类的东西。在ObjectiveC中完全使用指针来处理对象。n这行程序代码实际上做了两件事:Fractionalloc呼叫了Fractionclass的allocmethod。这就像malloc内存这个动作也做了一样的事情。nobjectinit是一个建构子(constructor)呼叫负责初始化对象中的所有变量。它呼叫了Fractionalloc传回的instance上的initmethod。这个动作非常普遍所以通常以一行程序完成:Object*var=ObjectallocinitnfracsetNumerator:非常简单。它呼叫了frac上的setNumeratormethod并传入为参数。n如同每个C的变体ObjectiveC也有一个用以释放内存的方式:release。它继承自NSObject这个method在之后会有详尽的解说。详细说明o多重参数n目前为止我还没展示如何传递多个参数。这个语法乍看之下不是很直觉不过它却是来自一个十分受欢迎的Smalltalk版本。n基于"ProgramminginObjectiveC,"CopyrightbySamsPublishing一书中的范例并经过允许而刊载。nFractionh(void)setNumerator:(int)nandDenominator:(int)dnFractionm(void)setNumerator:(int)nandDenominator:(int)d{页码ObjectiveCBeginner'sGuidefile:C:DocumentsandSettingsAdministrator桌面ObjectiveCBegiPDFcreatedwithpdfFactoryProtrialversionwwwpdffactorycomnumerator=ndenominator=d}nmainm#import<stdioh>#import"Fractionh"intmain(intargc,constchar*argv){createanewinstanceFraction*frac=FractionallocinitFraction*frac=FractionallocinitsetthevaluesfracsetNumerator:fracsetDenominator:combinedsetfracsetNumerator:andDenominator:printitprintf("Thefractionis:")fracprintprintf("n")printitprintf("Fractionis:")fracprintprintf("n")freememoryfracreleasefracreleasereturn}noutputThefractionis:Fractionis:n这个method实际上叫做setNumerator:andDenominator:n加入其它参数的方法就跟加入第二个时一样即method:label:label:label:而呼叫的方法是objmethod:paramlabel:paramlabel:paramlabel:paramnLabels是非必要的所以可以有一个像这样的method:method:::简单的省页码ObjectiveCBeginner'sGuidefile:C:DocumentsandSettingsAdministrator桌面ObjectiveCBegiPDFcreatedwithpdfFactoryProtrialversionwwwpdffactorycom略label名称但以:区隔参数。并不建议这样使用。o建构子(Constructors)n基于"ProgramminginObjectiveC,"CopyrightbySamsPublishing一书中的范例并经过允许而刊载。nFractionh(Fraction*)initWithNumerator:(int)ndenominator:(int)dnFractionm(Fraction*)initWithNumerator:(int)ndenominator:(int)d{self=superinitif(self){selfsetNumerator:nandDenominator:d}returnself}nmainm#import<stdioh>#import"Fractionh"intmain(intargc,constchar*argv){createanewinstanceFraction*frac=FractionallocinitFraction*frac=FractionallocinitFraction*frac=FractionallocinitWithNumerator:denominator:setthevaluesfracsetNumerator:fracsetDenominator:combinedsetfracsetNumerator:andDenominator:printitprintf("Thefractionis:")fracprintprintf("n")printf("Fractionis:")页码ObjectiveCBeginner'sGuidefile:C:DocumentsandSettingsAdministrator桌面ObjectiveCBegiPDFcreatedwithpdfFactoryProtrialversionwwwpdffactorycomfracprintprintf("n")printf("Fractionis:")fracprintprintf("n")freememoryfracreleasefracreleasefracreleasereturn}noutputThefractionis:Fractionis:Fractionis:ninterface里的宣告就如同正常的函式。nimplementation使用了一个新的关键词:supern如同JavaObjectiveC只有一个parentclass(父类别)。n使用superinit来存取Superconstructor这个动作需要适当的继承设计。n你将这个动作回传的instance指派给另一新个关键词:self。Self很像C与Java的this指标。nif(self)跟(self!=nil)一样是为了确定superconstructor成功传回了一个新对象。nil是ObjectiveC用来表达CC中的方式可以引入NSObject来取得。n当你初始化变量以后你用传回self的方式来传回自己的地址。n预设的建构子是(id)init。n技术上来说ObjectiveC中的建构子就是一个"init"method而不像C与Java有特殊的结构。o存取权限n预设的权限是protectednJava实作的方式是在methods与变量前面加上publicprivateprotected修饰语而ObjectiveC的作法则更像C对于instancevariable(译注:C术语一般称为datamembers)的方式。nAccessh#import<FoundationNSObjecth>interfaceAccess:NSObject{publicintpublicVar页码ObjectiveCBeginner'sGuidefile:C:DocumentsandSettingsAdministrator桌面ObjectiveCBegiPDFcreatedwithpdfFactoryProtrialversionwwwpdffactorycomprivateintprivateVarintprivateVarprotectedintprotectedVar}endnAccessm#import"Accessh"implementationAccessendnmainm#import"Accessh"#import<stdioh>intmain(intargc,constchar*argv){Access*a=Accessallocinitworksa>publicVar=printf("publicvar:in",a>publicVar)doesn'tcompilea>privateVar=printf("privatevar:in",a>privateVar)areleasereturn}noutputpublicvar:n如同你所看到的就像C中private:listofvarspublic:listofvars的格式它只是改成了private,protected,等等。oClasslevelaccessn当你想计算一个对象被instance几次时通常有classlevelvariables以及classlevelfunctions是件方便的事。nClassAh#import<FoundationNSObjecth>页码ObjectiveCBeginner'sGuidefile:C:DocumentsandSettingsAdministrator桌面ObjectiveCBegiPDFcreatedwithpdfFactoryProtrialversionwwwpdffactorycomstaticintcountinterfaceClassA:NSObject(int)initCount(void)initializeendnClassAm#import"ClassAh"implementationClassA(id)init{self=superinitcountreturnself}(int)initCount{returncount}(void)initialize{count=}endnmainm#import"ClassAh"#import<stdioh>intmain(intargc,constchar*argv){ClassA*c=ClassAallocinitClassA*c=ClassAallocinitprintcountprintf("ClassAcount:in",ClassAinitCount)ClassA*c=ClassAallocinitprintcountagainprintf("ClassAcount:in",ClassAinitCount)creleasecreleasecreleasereturn页码ObjectiveCBeginner'sGuidefile:C:DocumentsandSettingsAdministrator桌面ObjectiveCBegiPDFcreatedwithpdfFactoryProtrialversionwwwpdffactorycom}noutputClassAcount:ClassAcount:nstaticintcount=这是classvariable宣告的方式。其实这种变量摆在这里并不理想比较好的解法是像Java实作staticclassvariables的方法。然而它确实能用。n(int)initCount这是回传count值的实际method。请注意这细微的差别!这里在type前面不用减号而改用加号。加号表示这是一个classlevelfunction。(译注:许多文件中classlevelfunctions被称为classfunctions或classmethod)n存取这个变数跟存取一般成员变数没有两样就像ClassA中的count用法。n(void)initializemethodis在ObjectiveC开始执行你的程序时被呼叫而且它也被每个class呼叫。这是初始化像我们的count这类classlevelvariables的好地方。o异常情况(Exceptions)n注意:异常处理只有MacOSX以上才支持。n基于"ProgramminginObjectiveC,"CopyrightbySamsPublishing一书中的范例并经过允许而刊载。nCupWarningExceptionh#import<FoundationNSExceptionh>interfaceCupWarningException:NSExceptionendnCupWarningExceptionm#import"CupWarningExceptionh"

精彩专题

热门资料

Android开发环境配置.pdf

Android开发之应用程序框架.doc

Android开发秘籍.pdf

android界面效果全汇总.pdf

编辑推荐

  • 名称/格式
  • 评分
  • 下载次数
  • 资料大小
  • 上传时间

用户评论

0/200
    暂无评论
上传我的资料

相关资料换一换

资料评价:

/ 43
所需积分:1 立即下载
返回
顶部
举报
资料
关闭

温馨提示

感谢您对爱问共享资料的支持,精彩活动将尽快为您呈现,敬请期待!