OC 语法基础

OC 的语法知识其实有蛮多,以下知识基础的一部分.

目录部分:

文章目录

@ 符号

在 OC 语言中,绝大部分的关键字使用的 @ 符号开头。记住这是一个规则就好了。

字符串

在 Java 中字符串和 C 语言中字符串定义的方式是一样的。
但是在 OC 中的字符串的定义是需要添加 @ 的,在OC 中字符串类型使用的是 NSString ,相对而言添加一个 NS 前缀。

Java: "Android"  "Java" 
OC:  @"OC" @"iOS"

//比如定义一个变量
NSString *name = @"小明";

NSLog 日志输出

OC 中的日志输出对象为 NSLog.
语法:NSLog(字符串); —— 表示需要打印的日志。
Java 中的 Log 和这个对标的,但是目前还没有发现 NSLog 有和 Log 日志等级关系的定义。

//简单使用
NSLog(@"Hello world, OC");
//高级使用
NSLog(@"1+1=%d",2)

#import导入指令

“#”表示的是一个预处理指令。
这个指令的作用:将文件的内容在预编译的时候拷贝写指令的地方.
简单的原理:#import指令在包含文件的时候,底层会先判断这个文件是否被包含 如果被包含就会略过 否则才会包含.

//导入系统的相关的使用的是“<>”
#import <Foundation/Foundation.h>
//导入其他非系统的类或者头文件使用的是 ""
#import "Person.h"

什么是一个类

面向对象语言定义基本上都是一样,这个定义 Java 和 OC 基本上没差。
描述具有相同特征和行为事物的集合。

OC 怎么创建一个类

OC 的类通常是有两个文件,一个是 .h 文件,一个是.m 文件

.h 头文件

表示一个类的声明

语法格式:

@interface 类名 : NSObject
{
声明特征(变量)
}
-声明方法
@end

说明
  1. interface 在 Java 中表示的是接口的意思,但是在 OC 表示的是头文件的标识。
  2. @end 作为表示当前这个类声明完成。
  3. “ :” 表示继承的关系,和 Kotlin 有点类似。
  4. NSObject 和 Java 是一样的,所有的对象创建时会默认自动生产一个这样的继承关系,Java 是不需要显示出来的,但是 OC 会显示出来。
@interface Person : NSObject
{
  int age;
  NSString *name;
  BOOL isBoy;
}
@end
.m 实现文件

表示一个类的实现

语法定义

@implementation 类名
{
特征和变量
}
方法实现
@end

注意事项:
  1. 在 .m 文件中定义的变量为私有变量,在其他的类是不能调用到的。
  2. 在 .m 中定义的方法在 .h 文件中如果没有定义就不能被外部的类所调用。
  3. 如果在 .h 文件中声明了一个方法,但是在 .m 文件中没有实现这个类,可编译通过,不可以运行。
@implementation Person
{
  //钱肯定只有自己能够访问
   float money;
}
@end

与 Java 语言相比,类的定义在 OC 中显得略有麻烦。

类生成对象的方式

类生成对象在 OC 有好几种常见的方式,这里只阐述两种比较常用的方式:

//第一种:
Person *person = [Person new];
//第二种
Person *person = [[Person alloc] init];
其中 alloc 表示分配内存空间, init 表示初始化成员变量。
这两种方式完全等价。

变量

语法

在 @interface 中定义的变量是在 { } 中,并且需要在变量头部声明 @public 才可以在 .m 和作为对象调用。
在 @implementation 中定义的语法只能在 .m 中使用。

代码

.h 中:

@interface Person : NSObject
{
    @public // 声明这些变量可以被访问
    int _age;
    NSString *_name;
    BOOL _isBoy;
}
@end

.m 中:

@implementation Person
{
    //钱肯定只有自己可以访问了
    int moeny;
}
@end
调用
//这个是和 C 语言兼容过来的。
Person *person = [Person new];
person->_name = 3;

方法

调用角度分为两种:一种是类方法;一种是对象方法。
这个地方对标的是 Java 中的静态方法和类方法。

从方法本身定义出发,也是分为两种:一种是无参方法和有参方法。
和所有其他的程序语言一样。

方法的构成的要素:(与语言无关)

  1. 返回类型
  2. 方法名称
  3. 参数(可有可无)

无参对象方法

语法

-(返回类型)方法名称;
这个语法和 Java 的差异还是蛮大的。
方法申明:

@interface Person : NSObject
{
    int age;
    NSString *name;
    BOOL isBoy;
}
- (void) eat;
@end

方法实现:

@implementation Person
{
  //钱肯定只有自己能够访问
   float money;
}
@end

- (void) eat{
  NSLog(@"人是铁饭是钢");
}
调用方法

[对象 方法名]
Java 中的都是点语法 ,但是在 OC 中不是这样。

 //Java对象方法调用(Java 中不存在类对象的概念,只是为了区分所以此处表示为对象方法)
 Person mPerson = new Person;
 mPerson.eat();

//OC 中对象方法调用
Person *person = [Person new] ;// OC 生成对象的方式
[person eat];

有参对象方法

语法

-(返回值类型)方法名称:(参数类型)参数名称1 : (参数类型)参数名称2
方法名称和参数数值之间以 “:” 表示分隔。

方法申明:
@interface Person : NSObject
{
    @public // 声明这些变量可以被访问
    int _age;
    NSString *_name;
    BOOL _isBoy;
}
//无参
-(void)eat;
//有参
-(void)setName:(NSString *)name withAge:(int)age withIsBoy:(BOOL)isBoy;
@end

方法实现:

@implementation Person
{
    //钱肯定只有自己可以访问了
    int moeny;
}
-(void)eat{
    NSLog(@"人是铁饭是钢");
}
/*setName   withAge  withBoy  withIsBoy 这个整体就是一个方法名称,至于为
 *什么用 withXXX 这是 OC 书写的一种比较好的习惯吧。这些变量之间没有特殊的符号的定义,除了变量空格就好了。
 */
-(void)setName:(NSString *)name withAge:(int)age withIsBoy:(BOOL)isBoy{
    _name = name;
    _age = age;
    _isBoy = isBoy;
}
@end
调用方式

这就不用相关的语言描述了。直接上代码:

Person *person = [Person new];
// 一个叫小明,3岁的男孩。
[person setName:@"小明" withAge:3 withIsBoy:YES];

以上基本就是对象方法的全部了

类方法

对象的方法用 “-” 表示。类方法用 “+” 表示。其他的方式全部和对象方法一致。
语法上体现的很简单。
在 OC 中类方法不能访问属性。所以一般如果在一个方法中不需要用到类属性的关系就可以使用类方法,相比而言,类方法的有:

  1. 节约空间:不需要生成对象就可以调用方法
  2. 提高效率:可以直接通过类访问方法
    方法声明:
@interface Utils: NSObject
    //无参方法
    + (void)start;
    //计算和(有参方法)
    +(int)add:(int)num1 andNum2:(int)num2;
@end

方法实现:

@implementation Utils
  + (void)start{
      NSLog(@"开始啦....");
  }
  + (int)add:(int)num1 andNum2:(int)num2{
         return num1 + num2;
  
}
@end

方法调用:

//类方法调用无参方法
[Utils start]; 
//类方法调用有参方法
[Utils add: 1 andNum2: 2  ];

以上基本上就是简单的语法基础的部分啦。后续还会有深入的 OC 学习更新,请期待哦。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容