没有合适的资源?快使用搜索试试~ 我知道了~
objective c经典快速入门教程 通俗易懂 精炼 IOS经典开发基础教程 Cocoa框架 适合新手 有java基础更容易
5星 · 超过95%的资源 需积分: 11 43 下载量 142 浏览量
2013-04-27
09:11:07
上传
评论 2
收藏 452KB PDF 举报
温馨提示
objective c经典快速入门教程 通俗易懂 精炼 IOS经典开发基础教程 Cocoa框架 适合新手 有java基础更容易
资源推荐
资源详情
资源评论
Objective-C 的
的的
的语法
语法语法
语法与
与与
与 Cocoa 框架
框架框架
框架
李海峰 QQ:61673110 邮箱:andrew830314@163.com
Objective-C 是苹果 Mac OS X、iOS 平台的开发语言,Objective-C 基于 C 语言的,增加面向对
象的相关特性。你可以认为 Objective-C 就是另一个版本的 C++,也就是它采用了与 C++不同
的语法,但也实现了面向对象。
NextStep 是一个使用 Objective-C 语言编写的功能强大的工具包,里面有大量的类库、结构
体等,被苹果收购之后,更名为 Cocoa,但是苹果并未更改 NextStep 中的类库名称,因此你
会看到大量的以 NS 为前缀的类名、结构体、枚举等。在 Objective-C 中使用前缀可以有效的
防止名称冲突。
Cocoa 框架由 Foundation Kit、App Kit 两部分组成,前者是基础工具库,是你必须首先要学
会的,后者主要是 UI 库、高级对象等,我们这里只介绍 Foundation Kit。
本文档使用 Windows 上的 GNUStep 作为 Objective-C 的编译器,不支持 Objective-C 2.0 的相
关新特性,但基本完全支持 Cocoa 的 Foundation Kit、App Kit 工具库。
1. GNUStep
的安装
的安装的安装
的安装:
::
:
首先前往网址 http://www.gnustep.org/experience/Windows.html,下载文件:
然后按照下面的顺序安装这四个文件到同一个目录(例如:C:\GNUstep):
(1.)gnustep-msys-system-xxx.exe
(2.)gnustep-core-xxx.exe
(3.)gnustep-devel-xxx.exe
(4.)gnustep-cairo-xxx.exe
安装完成后,进入开始---程序---GNUStep---Shell,你会看到一个在 Windows 上打开的命令行
窗口,你可以在其中使用 Linux 的 Shell 命令 cd、ls、rm 等进行操作。启动 Shell 之后,它会
在 GNUStep 的目录中建一个/home/xxx/的文件夹,xxx 为你当前登陆 Windows 系统的用户名
称,Shell 默认进入的就是这个目录,也就是 Linux 上的 cd ~。
你可以在 Shell 中使用 vi 命令创建 Objective-C 的源文件,但是推荐的方式是使用 UltraEdit
等编辑器编辑 Objective-C 的源文件,然后在 Shell 中编译、运行。
GNUStep 使用 GCC 编译器,编译 Objective-C 的命令:
gcc -o hello.exe hello.m
-I/GNUstep/System/Library/Headers
-fconstant-string-class=NSConstantString
-L/GNUstep/System/Library/Libraries
-lobjc -lgnustep-base
(1.)红色部分为编译生成的可运行文件,蓝色部分为要编译的源文件,可以有多个,使用空
格分隔。
(2.) 参数-I 表示头文件查找的路径,-L 表示库文件查找路径,-l 表示需要链接的库文件,
-fconstant-string-class=NSConstantString 主要是指定常量字符串所使用的 class。
2.
类定义
类定义类定义
类定义:
::
:
我们定义一个类,这个类完成的功能是使用两个 int 类型的数字组成一个分数。在 Objective-C
中必须首先定义一个接口,该接口用于描述这个类的组成,包含成员变量、类变量、类方法、
成员方法。接口文件的扩展名为 h,也就是定义为 C 语言中的头文件。
Fraction.h
#import <Foundation/Foundation.h>
static int t=0;
@interface Fraction: NSObject{
int numerator;//分子
@public int denominator;//分母
}
-(void) setNumerator: (int) numerator;//numerator 的 setter 方法
-(void) setDenominator: (int) denominator;//denominator 的 setter 方法
-(void) setNumerator: (int) numerator andDenominator: (int) denominator;
//一个同时设置两个成员变量的快捷方法
-(int) numerator;//numerator 的 getter 方法
-(int) denominator;//denominator 的 getter 方法
-(void) print;
+(void) t;
@end
一个 Objective-C 中的接口就是 C 语言中的一个 header 文件,这个文件结构如下所示:
#import Header
static 类型 变量名;
@interface 接口名: 父类名称{
访问修饰符 类型 变量名;
… …
}
-(返回值类型) 方法名: (参数类型) 参数名 标签 1: (参数类型) 参数名 … …
+(返回值类型) 方法名: (参数类型) 参数名 标签 1: (参数类型) 参数名 … …
@end
我们来逐行看一下上面的内容:
(1.) 这里与 C 语言不同的是导入头文件使用的是 import,而不是 include。另外与 C 语言一样
的地方是如果你想从当前目录查找 Header 文件,找不到就到系统的头文件库中查找,
请使用#import “Header 文件”,如果你只想从系统的头文件库中查找,请使用#import
<Header 文件>。Foundation/Foundation.h 包含了 Foundation Kit 中的所有的头文件定义,
GNUStep 的 Objective-C 的 Foundation 头文件在
\GNUStep 安装目录\GNUstep\System\Library\Headers\Foundation 文件夹。
GNUStep 的 Objective-C 的 AppKit 头文件在
\GNUStep 安装目录\GNUstep\System\Library\Headers\ AppKit 文件夹。
(2.) static 标识的类变量定义在接口的外面,类变量只能本类访问,除非提供类方法给外部
访问这个类变量。
(3.) Objective-C 中的@+指令表示 C 语言之外的 Objective-C 的衍生语法,因此@interface 表示
定义了一个接口,接口名称之后紧跟了一个冒号,冒号后是父类的名字,Objective-C 中
的顶级父类是 NSObject。
(4.) 接口定义之后紧接着一对{ },其中定义了成员变量,所谓的成员变量就相当于 JAVA 中的
实例变量,从属于类的对象。Objective-C 中的成员变量使用@public、@protected、@private
作为访问修饰符,默认是@protected。这里你要知道的是 Objective-C 中只有成员变量有
访问修饰符,类变量、类方法、成员方法是没有访问修饰符的,所有的方法都是 public
的,所有的类变量都是私有的。
(5.) 以-开头的方法为成员方法,以+开头的方法为类方法,方法中的类型描述(返回值类型、
参数类型)都必须使用( )包围。如果方法有多个参数,每个参数都有一个标签名(可以
省略,但不建议这样做),每个标签名之后使用冒号与参数描述分隔。在有多个参数的
方法中,实际的方法名称为 方法名
方法名方法名
方法名:标签名
标签名标签名
标签名 1:标签名
标签名标签名
标签名 2:… …,上面的拥有两个参数的方
法的方法名为 setNumerator:andDenominator:。
这里与 JAVA 不同的是 Objective-C 中的类方法只能类调用,如果你使用对象调用会报错,
而 JAVA 仅仅是在编译期给出警告。另外,Objective-C 中的大多数类方法都被用来提
供初始化对象的便捷方法 Convenience method。
(6.) 以@end 表示接口定义结束。这是因为与 JAVA 不同的是 JAVA 的类型定义使用{ }包围,
而 Objective-C 中的{ }只包围成员变量,因此必须有个结束标志,一般 JAVA 程序员经常
会忘记写这个结束标记。
这里你要知道 Objective-C 的@interface 与 JAVA 的 interface 并不是一回事儿,后面你会看到
Objective-C 中的@protocol 与 JAVA 中的 interface 才是等同的。这里你只需要记住的是
Objective-C 中的@interface 只是类的一个描述,因为@interface 通常在独立的 h 文件中,你
可以把它类比成 C 语言中的函数原型,也就是在 Objective-C 里应该叫做类的原型。通过这
个原型,编译器可以知道具体实现类有哪些功能。
上面的接口中的方法很简单,主要就是成员变量的 setter、getter 方法,这与 JAVA 没有什么
不同的。但是你会发现 getter 方法没有以 get 作为方法名称前缀,这是因为 get 开头的方法
在 Objective-C 中有着特殊的含义,这在后面将会看到。
下面我们编写实现类,Objective-C 的类文件使用扩展名 m。
Fraction.m
#import "Fraction.h"
@implementation Fraction
-(void) setNumerator: (int) n{
numerator=n;
}
-(void) setDenominator: (int) d{
denominator=d;
}
-(void) setNumerator: (int) n andDenominator: (int) d{
numerator=n;
denominator=d;
}
-(int) numerator{
return numerator;
}
-(int) denominator{
return denominator;
}
-(void) print{
printf("%d/%d\n",numerator,denominator);
}
-(void) m{
printf("-m:The class variable t is %d\n",++t);
}
+(void) t{
printf("+t:The class variable t is %d\n",++t);
}
@end
因为我们将 Fraction.m 与 Fraction.h 放在一个文件夹下面,所以#import 使用了” ”,这个类的
任务就是实现接口中的方法,因此与接口的结构不同的地方就是,你不能在这里定义变量,
@interface 换成了@implementation,其余就没有什么特别的了。你不必在这里实现@interface
中的全部方法,这不会导致错误。这里有个-(void) m 方法比较特别,我们并没有在@interface
中声明,那么这个方法可以调用吗?因为 Objective-C 是动态语言,即便是@interface 中没有
定义的方法,依然可以被调用。
另外,你需要注意的是 setter 方法与接口中不同的是参数名缩写成了 n、d,这是因为在方
法中,本地变量(参数、方法中定义的变量)在名称冲突的情况下,会隐藏成员变量,因此
导致 numerator=numerator 变成了无意义的操作。当然你可以使用后面提到的 self 关键
字,写成 self->numerator=numerator,也就是 JAVA 中的常用的 this.x=x 的写法。
下面我们编写调用代码,因为 Objective-C 基于 C 语言,所以程序的入口依然是 main 函数。
这里注意#import 的是 h,不是 m。
main.m
#import "Fraction.h"
int main(int argc,const char *argv[]){
Fraction *frac=[[Fraction alloc] init];
[frac setNumerator: 3 andDenominator: 5];
[frac print];
printf("The denominator of Fraction is %d\n",frac->denominator);
[Fraction t];//调用类方法
[frac m];
[frac release];
return 0;
}
(1.) 第一行我们创建了 Fraction 的实例(对象),Objective-C 中实例只能使用指针作为变量,
而不能使用值,所以你看到了*frac,而不是 frac,这与 JAVA 是一致的,JAVA 中的指向
实例的变量(JAVA 中叫做引用)也是指针,只不过 JAVA 中没有指针的概念,所以你没
有看到*。至于等号右侧的创建实例的代码,你可以在下面看到,这里先不用理会。
(2.) 第二行代码调用同时设置两个变量的方法,我们看到 Objective-C 的调用方法的语法格式
为[类或者实例的指针
类或者实例的指针类或者实例的指针
类或者实例的指针 方法名
方法名方法名
方法名: 参数
参数参数
参数 1 标签
标签标签
标签 1: 参数
参数参数
参数 2… …]。这种调用格式被称为中
缀语法,初次看起来有点儿怪,但实际这样更加有效。举个例子,你接手了一个离职的
人程序,其中的 JAVA 程序调用了一个有五个甚至更多的参数的方法,但是你手里没有
这个方法的 API,那么你很难猜得出来这五个参数到底都干什么用的,但是 Objective-C
调用的时候,每个参数前面都必须有方法的标签名,这样你便能很容易的从标签名看出
这个参数是什么意思。
(3.) 第四行在 C 的 printf()函数中使用了对象
对象对象
对象->成员变量
成员变量成员变量
成员变量的语法访问实例的变量,但一般我
们不推荐这么做,而是使用 getter 方法。这里你不能访问 numerator 变量,因为它是
@protected 的,只能本类、子类直接访问。
(4.) 第五行我们调用了类方法 t,你也可以换成这样的写法:
[[Fraction class] t];
或者
Class clazz=[Fraction class];
[clazz t];
class 来自于 NSObject,相当于 JAVA 中的 getClass()方法,也就是获取这个类的 Class 对象,
clazz 前面没有*,这是因为 Class 已经是一个指针。另外这种嵌套调用的方式,你也要习
惯,这就和 JAVA 中的 A.b().c()没有什么区别。
获取 Class 有如下几种方法:
[类或者对象 class]
[类或者对象 superclasss]
NSClassFromString(类名的字符串形式)
你也可以通过如下的函数把 Class 转换为字符串形式:
NSStringFromClass(Class)
(5.) 第六行我们调用了 m 方法,这个方法你会发现并没有在@interface 中声明,这里依然调
用了,只是在编译的时候收到一个警告。这就是前面所有的 Objective-C 是动态语言的原
因。但是一般情况下,你都会给别人提供 h 文件,所以你在 m 文件中写的 h 文件中没
有的方法,别人也是不会知道的,这个方法相当于变相的私有化了。
(6.) 第七行我们释放了 frac 实例在第一行 alloc 所申请的内存空间,Objective-C 的内存管理
后面会看到。另外,你会发现 Fraction.h 中没有定义 alloc、init、release 方法,但是我们
剩余55页未读,继续阅读
syh1992107
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于SimPy和贝叶斯优化的流程仿真系统.zip
- (源码)基于Java Web的个人信息管理系统.zip
- (源码)基于C++和OTL4的PostgreSQL数据库连接系统.zip
- (源码)基于ESP32和AWS IoT Core的室内温湿度监测系统.zip
- (源码)基于Arduino的I2C协议交通灯模拟系统.zip
- coco.names 文件
- (源码)基于Spring Boot和Vue的房屋租赁管理系统.zip
- (源码)基于Android的饭店点菜系统.zip
- (源码)基于Android平台的权限管理系统.zip
- (源码)基于CC++和wxWidgets框架的LEGO模型火车控制系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页