目录
开始 (1)
下载这篇教程 (1)
xcode入门
设定环境 (1)
前言 (1)
编译hello world (2)
创建classes (2)
@interface (2)
@implementation (2)
把他们组合在一起 (2)
详细说明 (1)
多个参数 (1)
构造子(Constructors) (2)
存取权限 (2)
Class level access (2)
异常(Exceptions) (4)
继承、多态(Inheritance, Polymorphism)以及其他实体导向功能 (8)
Id类型 (8)
继承(Inheritance) (12)
动态识别(Dynamic types) (15)
Categories (17)
Posing (20)
Protocols (21)
内存管理 (26)
Retain and Release(保留与释放) (26)
Dealloc (27)
Autorelease Pool (31)
Foundation framework classes (33)
NSArray (33)
NSDictionary (35)
优点与缺点 (37)
优点 (37)
缺点 (37)
更多资讯 (37)
开始
下载这篇教程
所有这篇初学者指南的原始代码都可以在 下载。这篇教程中的许多反例都是由Steve Kochan 在Programming in Objective-C. 一书中撰写。如果你想得到更多详细资料及范例,请直接参考该书。本网站所刊登的所有范例都经过他的允许,所以请勿复制转载。
设定环境
Linux/FreeBSD:安装GNUStep
为了编译GNUstep的应用程序,必须先执行位于/usr/GNUstep/System/Makefiles/G
NUstep.sh的GNUstep.sh这个文件。这个路径取决于你的系统环境,有些是在/usr,
some /usr/lib,有些是/usr/local。如果你的shell 是以csh/tcsh为基础的shell,
则应该改用GNUStep.csh。建议把这个指令放在.bashrc或.cshrc中。
Mac OS X: 安装XCode
Windows NT 5.X:安装cygwin或mingw,然后安装GNUStep
前言
这篇教程是建立在假设你已经有一些基本的C语言知识,包括C数据类型、什么是函数、设么是返回值、关于指针的知识以及基本的C语言内存管理。如果您没有这些背景知识,我非常建议你读一读K&R的书:The C Programming Language。这是C语言的设计者所写的书。
Objective-C是C的衍生语言,继承了所有C语言的特性,但是有一些例外,他们不是继承与C语言的特性本身的。
nil:在C/C++里你或许曾经使用过NULL,而在Objective-C中则是nil。不同之处是你可以传递消息给nil(例如[nil message]),这是完全合法的,但是你却不能对NULL做这样的操作。
BOOL:C没有正式的布尔类型,而在Objective-C中也不是“真的”有。它是包含在Fo undation classes(基础类库)中(即import NSObject.h,nil也是包括在这个头文件中的)。BOOL在Objective-C中有两种取值:YES或NO,而不C语言中的是TRUE或FALSE。
#import vs #include:就如同你在hello world范例中看到的,我们使用了#import。#i mport由gcc编译器支持。我并不建议使用#include,#import基本上跟.h头文件的#ifndef # define #endif 相同。许多程序员都同意,使用这些东西是非常愚蠢的。无论如何,使用#i mport就对了。这样不但可以避免麻烦,而且万一有一天gcc把它拿掉了,将会有足够的O bjective-C程序员可以坚持保留它或是将它放回来。偷偷告诉你,Apple在它们官方的程序代码中也使用了#import。所以万一有一天这种事真的发生,不难预料Apple 将会提供一个支持#import 的gcc 分支版本。
在Objective-C 中,方法及message这两个字是可以互换的。不过messages拥有特别的特性,一个message 可以动态的传送给另一个实体。在Objective-C 中,调用实体上的一个消息并不一定表示实体真的会响应这个消息,而是实体知道如何以某种方式去响应它,或是传送给知道如何响应的实体。
本文大部分范例都是基于Programming in Objective-C," Copyright ©2004 by Sams P ublishing 一书中的范例,并经过允许而刊登。
编译hello world
输出:LLO WORLD
在Objective-C 中使用#import 代替#include ,Objective-C 的预设文件名是.m
创建classes
@interface
NSObject:NeXTStep Object 的缩写。因为它已经改名为OpenStep,所以这在今天已经不是那么有意义了。
继承(inheritance)以Class: Parent表示,就像上面的Fraction: NSObject。
夹在@interface Class: Parent { .... } 中的称为instance variables。
没有设定存取权限(protected, public, private)时,预设的存取权限为protected。设定权限的方式将在稍后说明。
Instance 方法s 跟在成员变量(即instance variables)后。格式为:scope(returnType) 方法Name: (parameter1Type) parameter1Name;
scope 有class或instance两种。instance 方法s以”-“开头,class level 方法s以”+”开头。Interface以一个@end作为结束。
@implementation
Implementation以@implementation ClassName开始,以@end结束。
Implement定义好的方法s 的方式,跟在interface 中定义时很近似。
把他们组合在一起
main.m
输出:The fraction is: 1/3
FRACTION*FRAC=[[FRACTION ALLOC]INIT];
这行代码中有很多重要的东西。
在Objective-C中调用方法s的方法是[object 方法],就像C++ 的object->方法()。
Objective-C没有value类型。所以没有像C++的FRACTION FRAC;FRAC.PRINT();这类的东西。在Objective-C中完全使用指针来处理数据。
这行代码实际上做了两件事:[Fraction alloc]调用了Fraction class的alloc 方法。这就像malloc 内存,这个动作也做了一样的事情。
[object init]是一个构造(constructor)调用,负责初始化对象中的所有变量。它调用了[Fraction alloc]返回的instance上的init 方法。这个行为非常普遍,所以通常以一行代码完成:Object *var = [[Object alloc] init];
[frac setNumerator: 1]非常简单。它调用了frac上的setNumerator 方法并传入1为参数。
如同每个C的变体般,Objective-C也有一个用以释放内存的方式:release。它继承自NSObject,这个方法在之后会有详细的说明。
详细说明
多个参数
目前为止我还没有演示如何传递多个参数。这个语法乍看之下不是很直观,不过它却是来自一个十分受欢迎的Smalltalk版本。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。