前言
入职第一份工作iOS开发,师傅说先学习一下语法OC,和Android很多不同,竟然和C和Java有点类似,start!
环境:mac pro 版本10.
编译器:xcode12.2
xcode对mac版本要求很苛刻,如果安装不了就升级系统,而且Pro的cv是commond+c不是ctrl+c,每次换换快捷键就很(╥﹏╥)
一、OC与C的区别
Objective-C简称OC,是C语言的升级版,封装语法更为简单优化。
新建一个OC项目:
//导入系统的相关的使用的是“<>”
#import <Foundation/Foundation.h>
//导入其他非系统的类或者头文件使用的是 ""
#import "Person.h"
int main(int argc,const char * argv[]){
NSLog(@"Hello World!");
}
-
.m代表message消息机制
-
main是OC的入口和出口,main的参数(可接收用户在运行时传递数据给程序、参数可不要)
-
int返回值 程序的结束状态
-
#import
将文件的内容拷贝到写指令的地方;其中#是预处理指令,import是include的增强(同一个文件无论import多少次,只会包含一次)。 -
框架:功能集 常用、Foundation框架 基础
-
@autoreleasepool是自动释放池(可删除、占时不必深入)
-
NSLog
(@“Hello,world!”);是printf的增强:
(1)会输出一些调试信息(执行时间、程序名称、进程编号、线程编号、输出信息)
(2)会自动换行(最后加上\n换行只换一次,后面自动换行失效)
(3)c,oc均可输出 -
字符串:
(1)C语言存储:a.字符数组,b.字符指针
(2)OC:NSString
指针变量,只能存储OC字符串的地址
(3)OC必须加前缀@符号NSLog(@"OC使用字符串要加前缀@") NSLog(@"我是%@",str)
-
前缀:NextStep->Cocoa->Foundation框架之中
-
@符号:将C转为OC字符串,绝大部分关键字以@开头
-
注释:和C同
//单行注释
/*
*多行注释
*/
- 函数的定义与调用(同C),编译连接执行:
(1)在.m中写代码
(2)使用 编译器将源码编译为目标文件
cc -c xx.m
a.预处理 b.检查语法 c.编译
(3)链接
cc xx.o //使用框架需要告诉编译器去哪个框架找函数和类
cc xx.o -framework
(4)执行
a.out
以上四步点击运行按钮即可
- oc和c的文件名对比:
源文件 | 目标文件 | 可执行文件 | |
---|---|---|---|
C | .c | .o | .out |
OC | .m | .o | .out |
二、OC的数据类型
- 支持所有的C:基本:int double float char;指针:int *p1;构造:数组 结构体 枚举;空类型:void;自定义类型:typeof。
BOOL
类型:YES和NO中的一个(条件表达式结果),占一个字节,1个有符号的char变量- Boolean:存储true或false(条件表达式结果),无符号,不常用
- class类型,类,可以直接调用
- id类型 万能指针
nil
类型:同C指针NULL,基本数据默认0,不指向地址- SEL方法选择器
- block代码段
三、OC面向对象和面向过程
OC的运算符、控制语句、关键字基本同C,
常用关键字3个:@interface、@implementation、@public
类与对象 (源文件中)
1. 类
->声明:
@interface Person:NSObject
{
//公有变量,均可访问
@public
NSString *_name;//属性的名称以下划线开头
int _age;
}
//方法的声明写在这个位置,函数用驼峰命名
- (void)sayhi;
- (void)sayhelloWithName:(NSString *)name;//一个参数
- (int)sumWith:(int)num1 and:(int)num2;//多个参数
@end
->实现:
@implementation Person
//方法实现写这
- (void)sayhi
{
NSLog(@"hi,你好呀!");
NSLog(@"我是%@,我今年%d岁了。",_name,_age);
}
//一个参数,尽量加个With等介词,增强代码可读性
- (void)sayhelloWith:(NSString *)name
{
NSLog(@"%@,很高兴认识你!",name);
}
//多个参数(一个加法实例)空格+冒号下一个参数,可以加上and增强可读性
- (int)sumWith:(int)num1 and:(int)num2
{
int sum = num1 + num2;
return sum;
}
@end
2. 对象
语法:类名 *对象名 = [类名 new];
例:
Person *p1 = [Person new];
(传说中的new一个对象,和java语法有点像;前面的import和Python语法有点相似,语言不分家系列。)
3. 方法
在main中:
- 如果不在同一个文件,先引入类#import “Person.h”
- 新建一个对象,通过对象调用方法
- 调用: [对象 函数方法];
Person *p1 = [Person new];
p1->_name = @"张三";
p1->_age = 18;
[p1 sayhi];
[p1 sayhelloWith:@"香香"];
int sum = [p1 sumWith:10 and:20];
NSLog(@"sum = %d",sum);
运行结果:
hi,你好呀!
我是张三,我今年18岁了。
香香,很高兴认识你!
sum = 30
注意:1个参数 xxxWith: ,多个参数 xxxand:…and:…
四、多文件开发
1.多类可指向同一个地址
内存的五大区域:
区域 | 定义 |
---|---|
堆 | 存储临时变量,局部变量 |
栈 | 存储成员变量,通过 new 或者 malloc calloc realloc申请出来的空间 |
BSS段 | 存储未初始化的全局变量,静态变量 |
数据段 | 存储已经初始化的全局变量,静态变量,常量 |
代码段 | 存储代码,存储程序的代码 |
2.分组导航标记
#pragma mark 备注
#pragma mark -
#pragma mark - 备注
3.多文件开发
-
同时创建.m和.h文件,新建文件时选择
Cocoa Class
-
同一个m文件中,调用本类方法:
[self 方法名]
-
连续包含关系
假设School中有Classes有Student三个类,其中student有name属性
在main函数调用时需要为这个学生命名,用法:
school1->class1->stuent1->_name = @"学生甲";
五、异常处理
错误、Bug、异常的区别
现象 | 措施 | |
---|---|---|
错误 | 源码不符合语法规范,无法编译 | 修改代码 |
Bug | 执行结果不符合预期 | 调试修改 |
异常 | 执行在特定条件下会终止,后面代码也不会执行了 | 捕获异常 |
捕获异常:
@try
{
//代码
}
@catch(NSException *ex)//ex是异常原因
{
//异常时,执行代码
}
@finally
{
//是否错误都会执行
}
一般用得较少,多数用选择器来判断
if([p1 respondsToSelector:@selector(sayhi)])
{
//有响应才执行
[p1 sayhi];
}
总结
语法不难,细节比较多,@和*号忘记比较多
参考学习:b站黑马程序员OC教学