Objective-C基础语法规则

Objective-C基础语法规则教程


简介

Objective-C是一种简单的面向对象的计算机语言。Oobjective-C扩展了标准的ANSI C语言。类的语法和设计主要是基于Smalltalk,最早的面向对象编程语言之一。

Objective-C:C的超集

Objective-C是ANSI版本C编程语言的超集,支持C的基本语法。在C代码中,你定义头文件和源代码文件,从代码实现细节分离公共声明。Objective-C头文件使用的文件名有:

扩展名 内容类型
.h 头文件。包含类、类型、函数和常量的声明
.m 源代码文件。源代码的扩展名,可以包含Objective-C和C代码
.mm 源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名。

如同所有其他的面向对象语言,类是Objective-C用来封装数据,以及操作数据的行为的基础结构。对象就是类的运行期间实例,它包含了类声明的实例变量自己的内存拷贝,以及类成员的指针。Objective-C的类规格说明包含了两个部分:接口和实现。接口部分包含了类声明和实例变量的定义,以及类相关的方法。实现部分包含了类方法的实际代码。

@interface MyClass:NSObject {
    //定义成员变量
    int count;
    id data;
    NSString* name;
}
//方法的声明
-(id)initWithString:(NSString*)aName;
+(MyCalss*)createMyClassWithString(NSString*)aName;
@end

上面的程序定义了一个名为MyClass并继承自NSObject的类。在OC的语言规则中,类的声明总是以@interface开始到@end结束。

方法

Objective-C中的类可以声明两种类型的方法:实例方法和类方法。实例方法就是一个方法,它在类的一个具体实例的范围内执行。也就是说,在你调用一个实例方法前,你必须首先创建类的一个实例。而类方法,比较起来,不需要你创建一个实例。

-(void) insertObject:(id)anObject atIndex:(NSUInteger)index

-:方法类型标识符,方法的声明必须以方法标识符开始;
void:返回值的类型;
insertObject:与anIndex一样为方法标识关键字;
id:与NSUInteger为参数类型;
anObject:与index同为参数名。

属性

属性是用来代替声明存取方法的便捷方式。他们仅仅是定义方法访问已有的实例变量的速记方式而已。属性声明应该放在类接口的方法声明那里。基本的定义使用@property编译选项,紧跟着类型信息和属性的名字。

@property BOOL flag;
@property (copy) NSString* nameObject;//在赋值过程中复制对象
@property (readOnly) UIVIew* rootView;//创建一个getter方法

使用属性的好处就是可以使用点语法访问它们。属性还有copy, retain, readwrite, readonly等属性。换而言之,Objective-C中引入的属性,以确保类的实例变量可以在类的外部访问。

myObject.flag=YES;//myObject为类方法名
CGRect myViewFrame=myObject.rootView.Frame;

语法规则

@interface Circle:NSObject   //为Circle类定义接口;NSObject表示是父类。
{
//成员变量
 ShapeColor fillColor;
 ShapeRect bounds;
}
//以下是方法声明
-(void) setFillColor: (ShapeColor) fillColor; //冒号前面的依次是方法标识符、返回值类型和方法名;冒号后面的内容依次为参数类型和参数名。
-(void) setBounds:(ShapeRect) bounds;
-(void) draw;
@end     //结束声明

注意:当方法的标识符为+是表示静态函数,-则为一般函数。

类实现

类的实现使用@implementation声明。

@implementation Circle
-(void) setFillColor: (ShapeColor) c
{
   fillColor=c;
}
-(void) draw
{
    NSLog(@”drawing a circle at(%d %d %d %d) in %@”, bounds.x,bounds.y,bounds.width,bounds.height,colorName(fillName));
}
@end

上面的实例中,我们一次实现了类Circle的setFillColor和draw方法。另外我们需要注意到的OC语法格式有:

  1. 双引号的前面的@表示这双引号中的字符串应该作为cocoa的NSString元素;
  2. %@表示输出为NSString数据类型,%d为整型;
  3. NSlog()和printf()类似,从控制台输出信息;
  4. 代码的最后依然需要以@end结尾;
  5. 如果我们需要访问fillColor成员变量可以使用Self.fillColor方法。

对象初始化

两种创建新对象的方法:

  • [类名 new]
  • [[类名 alloc] init]

这两种方法是等价的,但cocoa的惯例是使用后者。alloc在为对象分配空间的同时,将这块内存初始化为0;

调用写好的类和类函数

//创建新对象,使用缺省初始化函数
Bank *bankDefault = [[Bank alloc] init];
//调用方法:
[bank addAmount: 1];
[bank print];
// 释放对象:
[bankDefault free];

一个完整的实例

//引入头文件
 #import <Foundation/Foundation.h>
 //定义继承自NSObject的Box类
@interface Box:NSObject
{
    double length;   
    double breadth;  
    double height;   
}
@property(nonatomic, readwrite) double height; // 属性
-(double) volume; //类方法
@end //类定义结束

//类实现
@implementation Box
@synthesize height; //创建属性的访问器
-(id)init
{
   self = [super init];
   length = 1.0;
   breadth = 1.0;
   return self;
}

-(double) volume
{
   return length*breadth*height;
}
@end //类实现结束

//主函数
int main( )
{    
   Box *box1 = [[Box alloc]init];    
   Box *box2 = [[Box alloc]init];  //创建Box类对象并初始化
   double volume = 0.0;  
   // 对类的属性赋值
   box1.height = 5.0; 
   box2.height = 10.0;
   //box1
   volume = [box1 volume];
   NSLog(@"Volume of Box1 : %f", volume);
   // box2
   volume = [box2 volume];
   NSLog(@"Volume of Box2 : %f", volume);
   return 0;
}

运行结果如下:

2016-09-18 12:26:45.364523 OC[2035:85558] Volume of Box1 : 5.000000
2016-09-18 12:26:45.366837 OC[2035:85558] Volume of Box2 : 10.000000

通过上面的实例我们需要知道的是:

Objective-C中的中括号:
  • 用于通知某个对象该做什么;
  • 方括号内第一项是对象,其余部分是你需要对象执行的操作;
  • 在objective-c中通知对象执行某种操作,称为发送消息。(也叫调用方法)。
    另外, Objective—C代码语句必须分号;结束,这与C的语法是相同的。 在Objective-C语法中,@interface和@implementation都是需要以@end结束。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容