Objective-C基础语法(一)
这个系列文章,是在已有C/C++的语法基础之上,总结一下Objective-C的基础语法,方便能快速的在Apple设备和电脑上的程序开发。
1. 实验环境
实验环境使用的是Mac OS X 10.9.5操作系统,在该系统上使用Xcode进行开发。
我们可以在Xcode建立一个OS X的Application项目,选择项目类型为Command Line Tool,这个项目就是使用Objective-C来编写生成Mac OS下的控制台程序。新建一个main1.m文件,编写代码,例如:
#import <Foundation/Foundation.h>
int main(){
NSLog(@"Hello, Objective-C!");
return 0;
}
编译运行即可看到输出一行打印的信息。
Objective-C其实是C语言的扩展,它是可以兼容C语言的语法的,它并不使用.c或者.cpp文件,而使用.m文件来告诉编译器,这里是Objective-C代码,应该使用Objective-C编译器来编译这个文件,由于与C兼容,所以这里的main和return等语句的用法完全和C语言一样,不同的是这个没有使用#include语句而是使用#import语句,#import 是GCC编译器提供的,Xcode在编译C、C++、Objective-C程序时都会使用它的,它比起#include指令的好处在于,可保证头文件只被包含一次,而无需使用#ifdef等语句来避免了。
另外,Foundation.h是Foundation框架中的主头文件。Apple公司将Cocoa、Carbon、QuickTime和OpenGL等技术作为框架提供,其中Cocoa的组成部分有Foundation框架和Application Kit框架。
还有,NSLog是输出信息的函数,类似C中的printf,它的NS前缀表明它属于Cocoa框架中的函数,这样的命名原因是历史遗留问题。它比起printf来,增加了很多特性,比如自动增加时间戳,代码位置等,如输出的信息为:
2016-02-20 14:48:20.949 LearnObjC[6756:303] Hello, Objective-C!
可以看到,当中的字符串除双引号引用外,还在前面增加了一个@符号,这实际是告诉编译器,后面的字符串并不是当作C字符串,而当做Cocoa的NSString对象来处理的,适用于NSLog函数。
“NS”的前缀追溯到此工具包还被称为NextSTEP,它那时是NeXT Software公司的产品。NeXT电脑公司(随后更名为NeXT软件公司)是一间设立在美国加利福尼亚州红木城的由史蒂夫·乔布斯创建的电脑公司,专门制造和开发高等教育和商业市场上的工作站电脑,该公司于1996年12月被苹果公司收购。苹果公司收购后,并未破坏其软件的兼容性,就保持了NS的前缀。这个公司可是乔帮主被迫离开苹果后,又创立的一家电脑软件公司,乔帮主依靠它被苹果收购重新执掌苹果公司。
2. 变量和常量
Objective-C是C语言的扩展,所以一般的变量和常量的声明定义方法都是和C兼容的,什么int呀,double呀都是可以用的,所以这里就不再赘述。
3. 数据类型
Objective-C的普通数据类型和C语言大致相同,这里说一个特殊点的布尔类型,C语言中有布尔类型bool,Objecttive-C中也可以用,OC(Objective-C)中还有一个布尔类型BOOL,它可比C语言的bool类型早诞生十多年,在OC的代码中两种布尔类型均可以用,但在编写Cocoa代码时,要使用BOOL。
BOOL类型有两个取值:YES和NO,就类似C中bool类型的true和false,使用示例代码如下:
#import <Foundation/Foundation.h>
int main(){
BOOL boolean;
boolean=YES;
if (boolean==YES) {
NSLog(@"boolean1 is YES");
}else{
NSLog(@"boolean1 is not YES");
}
boolean=NO;
if (boolean==YES) {
NSLog(@"boolean1 is YES");
}else{
NSLog(@"boolean1 is not YES");
}
boolean=0;
if (boolean==YES) {
NSLog(@"boolean1 is YES");
}else{
NSLog(@"boolean1 is not YES");
}
boolean=1;
if (boolean==YES) {
NSLog(@"boolean1 is YES");
}else{
NSLog(@"boolean1 is not YES");
}
boolean=2;
if (boolean==YES) {
NSLog(@"boolean1 is YES");
}else{
NSLog(@"boolean1 is not YES");
}
return 0;
}
上述代码,将BOOL类型的boolean变量分别设置了多个值,然后进行判断输出。Objective-C中的BOOL实际是定义了一个有符号的char类型,占8个比特,将YES定义为1,将NO定义为0,所以可想而知,我们也可以将其他整数赋值给BOOL类型,只不过比如赋值为2的话,那么在进行逻辑比较的时候,就即不是YES也不是NO了,刚开始编写Objective-C时要多加注意,特别是写返回BOOL类型的函数时要注意。所以容易理解的是,上例的运行结果显示为:
2016-02-20 17:27:47.981 LearnObjC[7050:303] boolean1 is YES
2016-02-20 17:27:47.982 LearnObjC[7050:303] boolean1 is not YES
2016-02-20 17:27:47.983 LearnObjC[7050:303] boolean1 is not YES
2016-02-20 17:27:47.983 LearnObjC[7050:303] boolean1 is YES
2016-02-20 17:27:47.983 LearnObjC[7050:303] boolean1 is not YES
Program ended with exit code: 0
4. 程序语句与函数
在不涉及类与对象时,普通程序语句和函数组织形式肯定是完全兼容C的,所以if、while、for等语句以及函数形式就不再总结,只看一个非常简单的例子,就将前面的例子更改一下即可:
#import <Foundation/Foundation.h>
void DoCheck(BOOL boolean){
if (boolean==YES) {
NSLog(@"boolean1 is YES");
}else{
NSLog(@"boolean1 is not YES");
}
}
int main(){
BOOL boolean;
boolean=YES;
DoCheck(boolean);
boolean=NO;
DoCheck(boolean);
boolean=0;
DoCheck(boolean);
boolean=1;
DoCheck(boolean);
boolean=2;
DoCheck(boolean);
return 0;
}
该例子只是将前一个例子改写成函数调用的形式。
5. 类与对象的基础使用
OC是C的扩展,其扩展的部分就是“面向对象编程”的部分,所以说Objective-C是一门面向对象的编程语言。
类
声明一个类的时候,需要用到@interface关键字,同时其类的声明以@end结尾,这些@开头的关键字,均为对于C语言的扩展(因为C语言没有用到这些符号,正好Objective-C扩展时来用到),我们定义一个Person类,将其保存在people.h中:
#ifndef LearnObjC_people_h
#define LearnObjC_people_h
@interface Person : NSObject
{
NSString* name;
NSString* gender;
double height;
double weight;
}
- (void) run;
- (void) setName: (NSString*) name;
- (void) setGender:(NSString*)genderName setHeight:(double)theHeiht setWeight:(double)theWeight;
@end
#endif
上例代码中,其是继承了NSObject这个类,声明了一个Person类,这个继承的语法倒是挺像C++的,但是没有public、private等关键词的。整个类以@interface开始,以@end结束,成员变量写在了大括号中,另可以看出,声明了3个成员函数,成员函数用了一个较为奇特的语法,以-开始,然后将函数返回类型以圆括号括起来。对于参数的声明,也比较另类了,都是以参数描述名:(参数类型)参数名成对的来定义的,这个语法形式称为中缀符,将名称及参数合在一起,它与一般的C或者Java的函数名的概念差距较大。
有了声明之后,再利用@implement关键字来实现类,保存在people.m中:
#import <Foundation/Foundation.h>
#import "people.h"
@implementation Person
- (void) run
{
NSLog(@"a person named %@ ",name);
NSLog(@"gender:%@ height:%.2fm weight:%.1fkg",gender,height,weight);
}
- (void) setName:(NSString *)n
{
name=n;
}
- (void) setGender:(NSString *)genderName setHeight:(double)theHeiht setWeight:(double)theWeight
{
gender = genderName;
height = theHeiht;
weight = theWeight;
}
@end
其中NSLog调用中,字符串里的%@表示这个位置是一个NSString类型的字符串(即NSString*)。可以看出语法与声明的时候相近。
对象与调用
有了类了,就需要实例化成对象并调用其中的成员函数,下面完成基本的调用示例:
#import <Foundation/Foundation.h>
#import "people.h"
int main(int argc, const char * argv[]) {
id person0 = [Person new];
[person0 setName:@"jelly"];
[person0 setGender:@"female" setHeight:1.68 setWeight:50 ];
[person0 run];
return 0;
}
代码中,id是一种泛型,指向任意类型的对象,可以看到,它的类的实例化和成员函数调用也是相当另类,按照Objective-C的说法,中括号“[”、“]”包起来的对象和类的调用是“发送消息”,比如代码:
id person0 = [Person new];
是给Person类发送一个new消息,然后得到new出来的一个Person对象,并将这个对象赋给person0;
而代码:
[person0 setName:@"jelly"];
这行代码是给person0这个对象发送消息,来调用setName这个参数方法名,参数为@"jelly"。
上例的完整运行结果为:
2016-02-20 18:15:02.985 LearnObjC[7109:303] a person named jelly
2016-02-20 18:15:02.986 LearnObjC[7109:303] gender:female height:1.68m weight:50.0kg
Program ended with exit code: 0
这篇博客是Objective-C的基础语法介绍,适合有一定C/C++基础的学习者。内容涵盖实验环境(Mac OS X 10.9.5 + Xcode)、变量和常量、数据类型(包括布尔类型BOOL)、程序语句与函数,以及类与对象的基础使用。Objective-C在C语言基础上增加了面向对象特性,如类的声明和对象的实例化。文中通过示例代码详细解释了Objective-C的语法特点。

8011

被折叠的 条评论
为什么被折叠?



