Objective-C基础语法(一)

这篇博客是Objective-C的基础语法介绍,适合有一定C/C++基础的学习者。内容涵盖实验环境(Mac OS X 10.9.5 + Xcode)、变量和常量、数据类型(包括布尔类型BOOL)、程序语句与函数,以及类与对象的基础使用。Objective-C在C语言基础上增加了面向对象特性,如类的声明和对象的实例化。文中通过示例代码详细解释了Objective-C的语法特点。

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软件公司)是一间设立在美国加利福尼亚州红木城的由史蒂夫·乔布斯创建的电脑公司,专门制造和开发高等教育和商业市场上的工作站电脑,该公司于199612月被苹果公司收购。苹果公司收购后,并未破坏其软件的兼容性,就保持了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类型有两个取值:YESNO,就类似C中bool类型的truefalse,使用示例代码如下:

#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值