1. 命令行下编译
可使用名为gcc的GNU Objective-C编译器来编译并连接这个程序,gcc命令通常的格式为:
gcc -framework Foundation files -o progname
该选项说明你要使用有关Foundation框架的信息:
-framework Foundation
2. 语法
Objective-C是区分大小写的
Obj-C采用特定的语法对类和实例应用方法:[ClassOrInstance Method]
在这条语句中,左方括号要紧跟类的名称或该类的实例的名称,它后面能够是一个或者多个空格,空格后面是将要执行的方法。请求一个类或者实例来执行某个操做时,就是在向它发送一条消息。所以也能够表示为:
[receiver message]
@interface定义的方法中,开头的负号(-)通知Obj-C编译器,该方法是一个实例方法。其余惟一的选择是正号(+) 。类方法是对类自己执行某些操做的方法。
Apple的运行时系统提供了一个称为垃圾回收的机制,它可自动清理内存。可是,最好要学会如何本身管理内存的使用,而不是依赖于自动的机制。事实上,针对不支持垃圾回收的某些平台,如iphone进行程序设计时,就不能依赖与垃圾回收机制。
使用@property和@synthesize来自动生成设置函数方法和获取函数方法。
关键字self用来指明对象是当前方法的接收者。相似c++的this
@class,使用@class关键字声明一个类,提升了效率,由于编译器不须要处理整个类.h文件;而只须要xxx是个类名字。若是须要引用xxx类中的方法,@class指令是不够的,由于编译器须要更多的信息。须要知道该方法中有多少参数,它们是什么类型,方法的返回类型是什么。
关键字super,用来引用消息接收者的父类。
@selector(alloc) 为名为alloc的方法声称一个SEL类型的值。要肯定对象是否能够响应这个动做,可使用respondsToSelector。
@try, @catch(NSException), @throw, @finally [exception name] [exception reason]
接口中能够声明@protected(这个指令后面的实例变量可被该类及任何子类中定义的方法直接访问,这是默认的状况); @private (可被定义的类的方法直接访问,可是不能被子类中定义的方法直接访问);@public(可被该类定义的方法直接访问,也可被其余类或模块中定义的方法直接访问,使得其余方法或函数能够经过使用指针运算符->访问实例变量);@package(对于64位图像,能够在实现该类的图像的任何地方访问这个实例变量)
3. 继承
有时,建立类只是使建立子类更容易。所以,这些类名为抽象类。例如Foundation的NSNumber类是为了将数字做为对象处理而建立的抽象类。整数和浮点数字一般有不一样的内存需求。每种数字类型都有单独的NSNumber子类。由于这些子类属于NSNumber类,总起来名为簇(cluster)。向NSNumber类发送消息来建立新的整数对象时,使用合适的子类为整数对象分配必需的空间,并正确的设定其值。这些子类其实是私有的。你本身没法直接访问这些子类,只能经过抽象的超类间接访问。
4. Category
分类(Category)提供了一个方式,用它能够将类的定义模块化到相关方法的组或者分类中。它还提供了扩展示有类定义的简便方式,而且没必要访问类的源代码,也无需建立子类。
关于分类有几点值得注意,首先,尽管分类能够访问原始类的实例,变量,可是它不能添加自身的任何变量,若是须要添加变量,能够考虑建立子类;另外,分类能够重载该类中的另外一个方法,可是一般认为这种作法是拙劣的设计习惯。其一,重载了一个方法之后,不再能访问原来的方法。所以,必须当心地将被重载方法中的全部功能复制到替换方法中。若是确实须要重载方法,正确的选择多是建立子类。若是在子类中重载方法,仍然能够经过向super发送消息来引用父类的方法;和通常接口方法不一样的是,没必要实现分类中的全部方法。这对于程序扩展颇有用,由于能够在该分类中声明全部方法,而后在一段时间以后才实现它。
5. Protocol
协议(protocol)是多个类共享的一个方法列表。协议中列出的方法没有相应的实现。若是定义了本身的协议,则没必要由本身实际实现它。可是,这就告诉其余程序员:若是要采用这项协议,则必须实现这些方法。这些方法能够从超类继承;能够在@protocol中使用@optional指令,下面列出的全部方法的指令都是可选的,以后能够在协议内定义@required指令来列出须要的方法。
可使用conformsToProtocol方法检查一个对象是否遵循某项协议;定义一项协议时,能够扩展示有协议的定义,因此如下协议定义:
@protocol Drawing3D <Drawing>
说明Drawing3D协议也采用了Drawing协议。所以,任何采用Drawing3D协议的类都必须实现此协议列出的方法
分类也能够采用一项协议,如:@interface Fraction (Stuff) <NSCopying, NSCoding>
非正式协议实际上仅仅是一个名称之下的一组方法。前面描述的@optional指令添加到了Obj-C 2.0语言中,用于取代非正式协议的使用。
6. id类型
id类型是一种通用的对象类型。为何不把全部的对象都声明为id类型呢?使用静态类型时,编译器尽量确保变量的用法在程序中始终保持一致。编译器经过检查来肯定应用于对象的方法是由该类定义的或者由该类继承,不然它显示警告信息。静态类型是由于它能更好地在程序编译阶段而不是在运行时指出错误。使用静态类型的另外一个缘由是它可以提升程序的可读性。
id类型是通用指针类型:由于经过指针,也就是内存地址来引用对象,因此能够自由地将它们在id变量之间来回赋值。所以返回id类型值的方法只是返回指向内存中某对象的指针。而后能够将该值赋给任何对象变量。由于不管在哪里,对象老是携带它的isa成员,因此即便将它存储在id类型的通用对象变量中,也老是能够肯定它的类。
7. Cocoa & Cocoa Touch
Application Kit框架包括普遍的类和方法,它们用来开发交互式图形应用程序,使得开发文本/菜单/工具栏/表/文档/剪贴板和窗口之类的过程变得十分简便。在Mac OSX操做系统中,术语cocoa总的来讲指的是Foudation框架和AppKit框架。术语Cocoa Touch是指Foudation框架和UIKit框架。
8. 内存管理
自动释放池能够自动释放添加到该池中的对象所使用的内存。向对象发送一条autorelease消息时,就将该对象放到这个池中。释放这个池时,添加到该池的全部对象也会一块儿释放。
当对象的引用计数达到0时,系统就知道再也不须要这个对象,所以系统就会释放它的内存,这是经过向对象发送一条dealloc消息而实现的。
经过向对象发送retainCount消息,能够得到这个对象的引用计数。
若是你的方法中再也不须要一个对象,但须要返回它,那么向其发送一条autorelease消息,将它标记为之后释放。消息autorelease并不影响对象的引用计数。所以它容许消息的发送者使用这个对象,而后仍然在之后当自动释放池时,释放这些对象。
若是使用alloc或者copy方法(或使用allocWithZone,copyWithZone或mutableCopy方法)直接建立对象,则由你负责释放它。每次retain对象时,应该release或者autorelease它。