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 
//导入其他非系统的类或者头文件使用的是 ""
#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 学习更新,请期待哦。

你可能感兴趣的:(OC 语法基础)