Objective-C基础知识加语法加总结.doc_第1页
Objective-C基础知识加语法加总结.doc_第2页
Objective-C基础知识加语法加总结.doc_第3页
Objective-C基础知识加语法加总结.doc_第4页
Objective-C基础知识加语法加总结.doc_第5页
免费预览已结束,剩余121页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一部分Objective-C基础知识一、XCode、Objective-C、Cocoa说的是几样东西?答案:三样东西。XCode:你可以把它看成是一个开发环境,就好像Visual Studio或者Netbeans或者SharpDevelop一样的玩意。你可以将Interface Builder认为是Visual Studio中用来画界面的那部分功能单独提出来的程序。Objective-C:这是一种语言,就好像c+是一种语言,Java是一种语言,c#是一种语言,莺歌历史也是一种语言一样。Cocoa:是一大堆函数库,就好像MFC、.NET、Swing这类玩意,人家已经写好了一堆现成的东西,你只要知道怎么用就可以了。有些人会比较容易混淆Objective-C和Cocoa,就好像有些人会混淆c#和.NET一样。这两个东西真的是两个不一样的东西。二、Objective-C是什么?你可以把它认为是语法稍稍有点不一样的c语言。虽然第一眼望上去你可能会认为它是火星语,和你所认知的任何一种语言都不一样。先简单列出一点差别:问题一:我在程序中看到大量的减号、中括号和NS*这种东西,他们是什么玩意儿?1 减号(或者加号)减号表示一个函数、或者方法、或者消息的开始,怎么说都行。比如c#中,一个方法的写法可能是:private void hello(bool ishello)/OOXX用Objective-C写出来就是-(void) hello:(BOOL)ishello/OOXX挺好懂的吧?不过在Objective-C里面没有public和private的概念,你可以认为全是public。而用加号的意思就是其他函数可以直接调用这个类中的这个函数,而不用创建这个类的实例。2 中括号中括号可以认为是如何调用你刚才写的这个方法,通常在Objective-C里说“消息”。比如C#里你可以这么写:this.hello(true);在Objective-C里,就要写成:self hello:YES;3 NS*老乔当年被人挤兑出苹果,自立门户的时候做了个公司叫做NextStep,里面这一整套开发包很是让一些科学家们喜欢,而现在Mac OS用的就是NextStep这一套函数库。这些开发NextStep的人们比较自恋地把函数库里面所有的类都用NextStep的缩写打头命名,也就是NS*了。比较常见的比如:NSLogNSStringNSIntegerNSURLNSImage你会经常看到一些教学里面会用到:NSLog (%d,myInt);这句话主要是在console里面跟踪使用,你会在console里面看到myInt的值(在XCode里面运行的时候打开dbg窗口即可看到)。而我们在其他开发环境里面可能会比较习惯使用MessageBox这种方式进行调试。你还可以看到其他名字打头的一些类,比如CF、CA、CG、UI等等,比如CFStringTokenizer 这是个分词的东东CALayer 这表示Core Animation的层CGPoint 这表示一个点UIImage 这表示iPhone里面的图片CF说的是Core Foundation,CA说的是Core Animation,CG说的是Core Graphics,UI说的是iPhone的User Interface还有很多别的,等你自己去发掘了。问题二、#import、interface这类玩意说的是什么?1、#import 你可以把它认为是#include,一样的。但是最好用#import,记住这个就行了。2、interface等等比如你在c#中写一个抓孩子类的定义:public class Kids : Systemprivate string kidName=”mykid”;private string kidAge=“15”;private bool isCaughtKid()return true;当然,上面的写法不一定对,就是个用于看语法的举例。在Objective-C里就得这么写:先写一个kids.h文件定义这个类:interface Kids: NSObject NSString *kidName;NSString *kidAge;-(BOOL) isCaughtKid:;end再写一个kids.m文件实现:#import “kids.h”implementation Kids-(void) init kidName=”mykid”;kidAge=”15”;-(BOOL) isCaughtKid:return YES;end这个写法也不一定对,主要是看看语法就行了。-_-b问题三、一个方法如何传递多个参数?一个方法可以包含多个参数,不过后面的参数都要写名字。多个参数的写法(方法的数据类型) 函数名: (参数1数据类型) 参数1的数值的名字 参数2的名字: (参数2数据类型) 参数2值的名字 . ;举个例子,一个方法的定义:-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName;实现这个函数的时候:-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName大儿子 = myOldestKidName;二儿子 = mySecondOldestKidName;三儿子 = myThirdOldestKidName;调用的时候:Kids *myKids = Kids alloc init;myKids setKids: ”张大力” secondKid: ”张二力” thirdKid: ”张小力”;而如果你用c#写这个方法,大致的写法可能是public void setKids( string myOldestKidName,string mySecondOldestKidName,string myThirdOldestKidName)调用的时候大概的写法可能是:Kids myKids = new Kids();myKids.setKids (“张大力”, “张二力”, “张小力”);明白了吧?其实不怎么难看懂。基本上,如果你能了解下面这段代码的转换关系,你Objective-C的语法也就懂了八成了:MyClass allocinit:foo bar autorelease;转换成C#或者Java的语法也就是:MyClass.alloc().init(foo.bar().autorelease();三、其他的一些东西其实这些本站之前的文章有所提及,这里再详细解释一下。1、 id:Objective-C有一种比较特殊的数据类型是id。你可以把它理解为“随便”。在Objective-C里,一切东西都是指针形式保存,你获取到的就是这个对象在内存的位置。那么id就是你知道这个位置,但是不知道里面是啥的时候的写法。2、 同一个数组可以保存不同的对象:比如一个数组NSArray,这种数组里面可以保存各种不同的对象,比如这个数组里:myArray -| 0: (float) 234.33f 1: ”我是个好人” 2: (NSImage *)(俺的美图) 3: ”我真的是好人”这是一个由4个东西组成的数组,这个数组包括一个浮点数,两个字符串和一个图片。3、BOOL,YES,NO:你可以认为YES表示C#或者Java里的true,NO表示false。而实际上YES是1,NO是0,BOOL本身就是个char。4、IBOutlet、IBAction是啥玩意,总能看到。这两个东西其实在语法中没有太大的作用。如果你希望在Interface Builder中能看到这个控件对象,那么在定义的时候前面加上IBOutlet,在IB里就能看到这个对象的outlet,如果你希望在Interface Builder里控制某个对象执行某些动作,就在方法前面加上(IBAction)。而这两个东西实际上和void是一样的。5、nil。Objective-C里的NULL(空)就这么写,表示空指针。6、为什么是”字符串”而不是”字符串”前面加上符号,编译器在编译的时候会在程序中给你留出位置,这样才能保证这个字符串不会丢失。反正记住,如果你要想把某些字符串写死在程序里,就要用”字符串”,如果忘了用,程序应该会出错。superzhou大侠指正:6、为什么是”字符串”而不是”字符串”字符串”是C的字符串,”是把C的字符串转成NSString的一个简写.在需要NSString的地方才需要这个转化,例如NSLog里面.在需要C string的地方,还是用”字符串”的.另外,”这个转换是不支持中文的.例如NSLog(”字符串”); 是一定输出不了中文的.四、Objective-C 2.0Objective-C 2.0是Leopard新增加的一门语言,其实和原来的Objective-C是一样的。主要是增加了属性。详细的内容这里不写了,可以参阅Allen Dang的这篇文章,写的很明白。/?p=81五、总结现在来总结一下怎么看Objective-C的代码和怎么开始学Objective-C吧。1、记住Objective-C就是C,不是火星语,这个很关键。2、记住你自己看不懂不表示脑子迟钝,大部分人第一次看Objective-C的代码可能比你还要迟钝。3、把CocoaC加入收藏夹,看不明白代码就来再看一遍这篇开宗明义的好文。4、文档很关键,当你看不懂某些东西说的是什么的时候,先查Cocoachina,再看英文文档里面的API说明,尤其这个类是以NS开头的时候。再不行就去google搜,直接把你要查的方法贴进google,通常能找到不少人也在问同样的问题,自然也有热心人活雷锋帮助回答。5、可以看hello world例子,但是不能总看,看多了真的会晕。另外,千万要放弃苹果官方的Currency Converter货币转换的例子,那个例子是毒药,刚学的时候越看越蒙。6、学习一门语言最好的方法是先用,和学外语一样,当你会说的时候自然会读。给自己设立一个简单的目标,比如做一个简单的程序,然后一点点解决问题。这样学习起来比只看例子快得多。这是一篇初学者写的文章,希望对同样是初学者的你有一点点帮助:)虽然只是很肤浅的一点点内容,但是应该对你迈入Objective-C的大门有一点帮助。看懂了这篇文章,回过头看Cocoachina的其他文章,你就会觉得很顺眼了。记得天天来哦。 第二部分 Objective-C语法Objective-C是Mac软件开发领域最主要的开发语言。假如我们对面向对象的思维已经C语言都很熟悉的话,对于我们学习Objective-C将会非常有用方法调用(Calling Methods)为了能够尽快上手,我们先来看一些简单的例子。Objective-C语法里面基本的方法调用是这样的:object method;object methodWithInput:input;对象的方法可以返回值:output = object methodWithOutput;output = object methodWithInputAndOutput:input;我们也可以在类里面调用如何创建对象的方法。下面的这个例子里面,我们调用了NSString类的string方法:id myObject = NSString string;id的类型意味着myObject这个变量可以指向任意类型的变量。当我们编译这个应用程序的时候,并不知道他实现的真实的类和方法。在这个例子里面,很明显这个对象的类型应该是NSString,所以我们可以改一下他的类型:NSString* myString = NSString string;现在myString就是一个NSString类型的变量。这个时候假如我们试图使用一个NSString没有实现的方法时,编译器就会警告我们。一定要注意在对象类型的右边有一个星号。所有的Objective-C对象变量都是指针类型的。id类型已经预先被定义成一个指针类型了。所以我们不需要再加星号。嵌套消息调用(Nested Messages)在许多编程语言里面嵌套消息,或者嵌套函数看起来就像这样:function1 ( function2() );function2的返回值被传递给function1当输入参数。在Objective-C里面,嵌套消息调用就像这样:NSString stringWithFormat:prefs format;我们应该尽量避免在一行代码里面嵌套调用超过两个。因为这样的话,代码的可读性就不太好。多参输入的方法(Multi-Input Methods)多个输入参数的方法。在Objective-C里面,一个方法名可以被分割成几段。在头文件里面,就应该这样子来定义一个多输入参数的方法:-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;我们这样来调用它:BOOL result = myData writeToFile:/tmp/log.txt atomically:NO;参数不一定要给它命名。在运行期系统里面这个方法真实的名字叫writeToFile:atomically:。Accessors(Getter & Setter)在Objective-C里面所有的实例对象默认都是私有的。所有在大多数情况下我们需要用accessors去读取或者设置变量的值。有两个语法都支持这样的操作,这个时传统的老的语法:photo setCaption:Day at the Beach;output = photo caption;第二行的代码其实并非直接去读对象实例的变量。事实上它调用的是名叫caption的方法。在Objective-C里大多数情况下我们不需要给getters加get的前缀。无论什么时候我们见到方括号,其实我们都是向一个对象或者一个类发送了一个消息。Dot Syntax在Objective-C 2.0里面,新增加了一个.操作的语法。在Mac OS X 10.5里面就使用了Objective-C 2.0语法:photo.caption = Day at the Beach;output = photo.caption;我们两种方式都可以使用。但是在一个工程里面最好保持风格一致,只使用某一种。.操作只能够被使用在setters和getters里面,而不能用在一般意思的方法上。创建对象主要有两种方式来创建一个对象。第一种办法像这面这样:NSString* myString = NSString string;这是一种非常习惯性的风格。在这种方式情况下,我们创建的是系统自动释放(autoreleased)类型的对象。关于自动释放类型autoreleased,我们以后会深入讨论一下。然而在许多情况下,我们需要手动的去创建对象:NSString* myString = NSString alloc init;这是一个嵌套的方法调用。第一个调用的NSString自己的alloc方法。这是一个相对比较底层的调用,因为他创建了内容,以及实例化了一个对象。第二块代码调用了新创建对象的init方法。这个init方法实现了比较常用的基本设置,比如创建实例对象的参数。对于一般开发人员而言,实现这个客户的类的具体的细节并不清楚。在一些情况下,我们可以用不通的初始化方式去赋初值:NSNumber* value = NSNumber alloc initWithFloat:1.0;基本的内存管理假如我们正在为Mac OS X开发一个应用程序,我们可以选择是否启用垃圾回收机制。这就意味着我们不需要去考虑内存管理,除了一个特别复杂的情形我们需要处理一下。然而,我们有的时候我们的开发环境没有垃圾回收机制,比如iPhone开发的时候就没有垃圾回收机制。在这种情况下,我们就需要了解一些基本的内存管理方面的概念。假如我们手动的通过alloc创建了一个对象,我们需要用完这个对象后release它。我们不需要手动的去release一个autoreleased类型的对象,假如真的这样去做的话,我们的应用程序将会crash。这里有两个例子:/ string1 will be released automaticallyNSString* string1 = NSString string;/ must release this when doneNSString* string2 = NSString alloc init;string2 release;就这个教程而言,我们可以人为autoreleased对象会在当前函数方法调用完成后被释放。当然了,还有很多关于内存管理的只是我们需要学习,但是这需要我们了解更多的基本概念以后才能去涉及。设计一个类的Interface就Objective-C语言而言,创建一个类非常简单。它非常典型的分成了两个部分。类的接口通常保存在ClassName.h文件里,它定义了实例的参数,以及一些公开的方法。类的实现在ClassName.m文件里。它包含了真正运行的代码和那些方法。它还经常定义一些私有的方法。这些私有的方法对于子类是不可见的。这里有一个接口文件的大概。类名Photo,所以文件名叫Photo.h:#importinterface Photo : NSObject NSString* caption;NSString* photographer;end首先,我们把Cocoa.h import进来。Cocoa的应用程序的所有的基本的类大多都是这样做的。#import宏指令会自动的避免把同一个文件包含多次。interface符号表明这是Photo类的声明。冒号指定了父类。上面这个例子父类就是NSObject。在大括弧里面,有两个变量:caption和photographer。两个都是NSString类型的。当然了,他们也可以是任何别的类型包括id类型的。最后end结束整个声明。增加方法让我们为成员变量加一些getters:#importinterface Photo : NSObject NSString* caption;NSString* photographer;- caption;- photographer;end别忘记,Objective-C方法不需要加get前缀。一个单独小横杆表明它是一个实例的方法。假如是一个加号的话,那就说明它是一个类的方法。编译器默认的方法的返回类型为id。还有所有的方法的参数的默认类型也都是id类型的。所以上面的代码从技术上讲是对的。但是很少这么用。我们还是给它加上返回类型吧:#importinterface Photo : NSObject NSString* caption;NSString* photographer;- (NSString*) caption;- (NSString*) photographer;end下面我们再加上setters:#importinterface Photo : NSObject NSString* caption;NSString* photographer;- (NSString*) caption;- (NSString*) photographer;- (void) setCaption: (NSString*)input;- (void) setPhotographer: (NSString*)input;endSetters不需要返回任何值,所以我们把它的类型指定为void.类的实现我们通过实现getters来创建一个类的实现:#import Photo.himplementation Photo- (NSString*) caption return caption;- (NSString*) photographer return photographer;end这部分的代码由implementation再来加上类名开始,以end结束。就跟类的接口定义一样,所有的方法跟接口定义里的一样。所有的对象都必要既要定义也要实现。假如我们以前也写过代码的话,Objective-C里面的getters看上去跟别的差不多。所以我们下面就来介绍setters,它需要一点说明。- (void) setCaption: (NSString*)inputcaption autorelease;caption = input retain;- (void) setPhotographer: (NSString*)inputphotographer autorelease;photographer = input retain;每个setter处理两个变量。第一个是当前存在对象的应用。第二个是新的输入对象。在支持垃圾回收的开发环境里,我们只要直接赋新值就可以了:- (void) setCaption: (NSString*)input caption = input;但是假如我们不可以用垃圾回收机制的话,我们就需要先retain旧的对象,然后retain新的对象。有两种方法可以释放一个引用对象:release 和 autorelease。标准的release会直接删除引用。autorelease方法会在将来的某个时候去release它。在它声明周期结束前,它会毫无疑问的存在。在本例中,上面setPhotographer中的photographer对象,将会在函数结束的时候被释放。在setter里面用autorelease是安全的,因为新对象跟老的对象有可能是同一个对象有可能指向的是同一个对象。对于一个我们即将retain的对象,我们不应该立即release它。这个也许现在看起来会困惑,但是随着我们的学习,会越来越能理解它。现在我们不需要立刻完全理解它。初始化我们可以创建一个初始化方法去给类的实例的成员变量赋初值:- (id) initif ( self = super init )self setCaption:Default Caption;self setPhotographer:Default Photographer;return self;上面的代码感觉没啥好解释的,虽然第二行代码好像看上去没啥用。这个是一个单等于号,就是把super init的值赋给了self。它基本上是在调用父类去实现它的初始化。这个if代码段是设置默认值之前验证初始化是否成功。释放资源Dealloc这个dealloc方法是在当一个对象希望被从内容里面删除的时候调用。这个我们释放在子类里面引用成员变量的最好的时机:- (void) dealloccaption release;photographer release;super dealloc;开始两行我们发送了release通知给了两个成员变量。我们不要在这里用autorelease。用标准的release更快一点。最后一行的super dealloc;非常重要。我们必须要发送消息去让父类清除它自己。假如不这么做的话,这个对象其实没有被清除干净,存在内存泄露。dealloc在垃圾回收机制下不会被调用到。取而代之的是,我们需要实现finalize方法。More on Memory ManagementObjective-C的内存管理系统基于引用记数。所有我们需要关心的就是跟踪我们引用,以及在运行期内是否真的释放了内存。用最简单的术语来解释,当我们alloc一个对象的时候,应该在某个时候retain了它。每次我们调用了alloc或者retain之后,我们都必须要调用release。/ 。图。这就是引用记数理论。但是在实践的时候,只有两种情况我们需要创建一个对象:1. 成为一个类的成员变量2. 只临时的在一个函数里面被使用在更多的时候,一个成员变量的setter应该仅仅autorelease旧的对象,然后retain新的对象。我们只需要在dealloc的时候调用release就可以了。所以真正需要做的就是管理函数内部的local的引用。唯一的原则就是:假如我们alloc或者copy了一个对象,那么我们在函数结束的时候需要release或者autorelease它。假如我们是通过别的方式创建的,就不管。这里是管理成员对象的例子:- (void) setTotalAmount: (NSNumber*)inputtotalAmount autorelease;totalAmount = input retain;- (void) dealloctotalAmount release;super dealloc;这里是本地引用的例子。我们只需要release我们用alloc创建的对象:NSNumber* value1 = NSNumber alloc initWithFloat:8.75;NSNumber* value2 = NSNumber numberWithFloat:14.78;/ only release value1, not value2value1 release;这里是用本地引用对象去设一个成员变量的例子:NSNumber* value1 = NSNumber alloc initWithFloat:8.75;self setTotal:value1;NSNumber* value2 = NSNumber numberWithFloat:14.78;self setTotal:value2;value1 release;注意到如何管理本地引用其实都是一样的。不管你是否把它设给了一个成员变量。我们无须考虑setters的内部实现。如果我们很好的理解了这些的话,我们基本上理解了80%的Objective-C内存管理方面的内容了。调用nil对象的方法(Calling Methods on Nil)在Objective-C里,nil对象被设计来跟NULL空指针关联的。他们的区别就是nil是一个对象,而NULL只是一个值。而且我们对于nil调用方法,不会产生crash或者抛出异常。这个技术被framework通过多种不同的方式使用。最主要的就是我们现在在调用方法之前根本无须去检查这个对象是否是nil。假如我们调了nil对象的一个有返回值的方法,那么我们会得到一个nil返回值。我们可以通过nil对象让我们的dealloc函数实现看上去更帅一点:- (void) deallocself.caption = nil;self.photographer = nil;super dealloc;之所以可以这么做是因为我们给把nil对象设给了一个成员变量,setter就会retain nil对象(当然了这个时候nil对象啥事情也不会做)然后release旧的对象。这个方式来释放对象其实更好,因为这样做的话,成员变量连指向随机数据的机会都没有,而通过别的方式,出现指向随机数据的情形机会不可避免。注意到我们调用的self.VAR这样的语法,这表示我们正在用setter,而且不会引起任何内存问题。假如我们直接去设值的话,就会有内存溢出:/ incorrect. causes a memory leak./ use self.caption to go through settercaption = nil;CategoriesCategories是Objective-C里面最常用到的功能之一。 基本上category可以让我们给已经存在的类增加方法,而不需要增加一个子类。而且不需要知道它内部具体的实现。如果我们想增加某个framework自带的类的方法,这非常有效。如果我们想在我们程序工程的NSString能够增加一个方法,我们就可以使用category。甚至都不需要自己实现一个NSString的子类。比如,我们想在NSString里面增加一个方法来判断它是否是一个URL,那我们就可以这么做:#importinterface NSString (Utilities)- (BOOL) isURL;end这跟类的定义非常类似。区别就是category没有父类,而且在括号里面要有category的名字。名字可以随便取,但是习惯叫法会让人比较明白category里面有些什么功能的方法。这里是具体的实现。但是要注意,这本身并不是一个判断URL很好的实现。我们主要是为了整体的了解category的概念。#import NSString-Utilities.himplementation NSString (Utilities)- (BOOL) isURLif ( self hasPrefix:http:/ )return YES;elsereturn NO;end现在我们可以在任何的NSString类对象里都可以调用这个方法了。下面的代码在console里面打印的string1 is a URL:NSString* string1 = http:/www.CocoaD/;NSString* string2 = Pixar;if ( string1 isURL )NSLog (string1 is a URL);if ( string2 isURL )NSLog (string2 is a URL);跟子类不一样,category不能增加成员变量。我们还可以用category来重写类原先的存在的方法,但是这需要非常非常小心。记住,当我们通过category来修改一个类的时候,它对应用程序里的这个类所有对象都起作用。后记:上面Objective-C的比较基础的大概的讲了一下。Objective-C还是比较好上手的。没有特别的语法需要去学习。而且一些概念在Objective-C里面被反复运用。【IT168技术】Objective-C是Mac软件开发领域最主要的开发语言。假如我们对面向对象的思维已经C语言都很熟悉的话,对于我们学习Objective-C将会非常有用。假如我们对C语言还不熟悉的话,那我们需要学习一下C语言。方法调用(Calling Methods)为了能够尽快上手,我们先来看一些简单的例子。Objective-C语法里面基本的方法调用是这样的:object method;object methodWithInput:input;对象的方法可以返回值:output = object methodWithOutput;output = object methodWithInputAndOutput:input;我们也可以在类里面调用如何创建对象的方法。下面的这个例子里面,我们调用了NSString类的string方法:id myObject = NSString string;id的类型意味着myObject这个变量可以指向任意类型的变量。当我们编译这个应用程序的时候,并不知道他实现的真实的类和方法。在这个例子里面,很明显这个对象的类型应该是NSString,所以我们可以改一下他的类型:NSString* myString = NSString string;现在myString就是一个NSString类型的变量。这个时候假如我们试图使用一个NSString没有实现的方法时,编译器就会警告我们。一定要注意在对象类型的右边有一个星号。所有的Objective-C对象变量都是指针类型的。id类型已经预先被定义成一个指针类型了。所以我们不需要再加星号。嵌套消息调用(Nested Messages)在许多编程语言里面嵌套消息,或者嵌套函数看起来就像这样:function1 ( function2() );function2的返回值被传递给function1当输入参数。在Objective-C里面,嵌套消息调用就像这样:NSString stringWithFormat:prefs format;我们应该尽量避免在一行代码里面嵌套调用超过两个。因为这样的话,代码的可读性就不太好。多参输入的方法(Multi-Input Methods)多个输入参数的方法。在Objective-C里面,一个方法名可以被分割成几段。在头文件里面,就应该这样子来定义一个多输入参数的方法:-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;我们这样来调用它:BOOL result = myData writeToFile:/tmp/log.txt atomically:NO;参数不一定要给它命名。在运行期系统里面这个方法真实的名字叫writeToFile:atomically:。Accessors(Getter & Setter)在Objective-C里面所有的实例对象默认都是私有的。所有在大多数情况下我们需要用accessors去读取或者设置变量的值。有两个语法都支持这样的操作,这个时传统的老的语法:photo setCaption:Day at the Beach;output = photo caption;第二行的代码其实并非直接去读对象实例的变量。事实上它调用的是名叫caption的方法。在Objective-C里大多数情况下我们不需要给getters加get的前缀。无论什么时候我们见到方括号,其实我们都是向一个对象或者一个类发送了一个消息。Dot Syntax在Objective-C 2.0里面,新增加了一个.操作的语法。在Mac OS X 10.5里面就使用了Objective-C 2.0语法:photo.caption = Day at the Beach;output = photo.caption;我们两种方式都可以使用。但是在一个工程里面最好保持风格一致,只使用某一种。.操作只能够被使用在setters和getters里面,而不能用在一般意思的方法上。创建对象主要有两种方式来创建一个对象。第一种办法像这面这样:NSString* myString = NSString string;这是一种非常习惯性的风格。在这种方式情况下,我们创建的是系统自动释放(autoreleased)类型的对象。关于自动释放类型autoreleased,我们以后会深入讨论一下。然而在许多情况下,我们需要手动的去创建对象:NSString* myString = NSString alloc init;这是一个嵌套的方法调用。第一个调用的NSString自己的alloc方法。这是一个相对比较底层的调用,因为他创建了内容,以及实例化了一个对象。第二块代码调用了新创建对象的init方法。这个init方法实现了比较常用的基本设置,比如创建实例对象的参数。对于一般开发人员而言,实现这个客户的类的具体的细节并不清楚。在一些情况下,我们可以用不通的初始化方式去赋初值:NSNumber* value = NSNumber alloc initWithFloat:1.0;基本的内存管理假如我们正在为Mac OS X开发一个应用程序,我们可以选择是否启用垃圾回收机制。这就意味着我们不需要去考虑内存管理,除了一个特别复杂的情形我们需要处理一下。然而,我们有的时候我们的开发环境没有垃圾回收机制,比如iPhone开发的时候就没有垃圾回收机制。在这种情况下,我们就需要了解一些基本的内存管理方面的概念。假如我们手动的通过alloc创建了一个对象,我们需要用完这个对象后release它。我们不需要手动的去release一个autoreleased类型的对象,假如真的这样去做的话,我们的应用程序将会crash。这里有两个例子:/ string1 will be released automaticallyNSString* string1 = NSString string;/ must release this when doneNSString* string2 = NSString alloc init;string2 release;就这个教程而言,我们可以人为autoreleased对象会在当前函数方法调用完成后被释放。当然了,还有很多关于内存管理的只是我们需要学习,但是这需要我们了解更多的基本概念以后才能去涉及。设计一个类的Interface就Objective-C语言而言,创建一个类非常简单。它非常典型的分成了两个部分。类的接口通常保存在ClassName.h文件里,它定义了实例的参数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论