Objective-C学习(一)基础

前言

入职第一份工作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!");
}
  1. .m代表message消息机制

  2. main是OC的入口和出口,main的参数(可接收用户在运行时传递数据给程序、参数可不要)

  3. int返回值 程序的结束状态

  4. #import 将文件的内容拷贝到写指令的地方;其中#是预处理指令,import是include的增强(同一个文件无论import多少次,只会包含一次)。

  5. 框架:功能集 常用、Foundation框架 基础

  6. @autoreleasepool是自动释放池(可删除、占时不必深入)

  7. NSLog(@“Hello,world!”);是printf的增强:
    (1)会输出一些调试信息(执行时间、程序名称、进程编号、线程编号、输出信息)
    (2)会自动换行(最后加上\n换行只换一次,后面自动换行失效)
    (3)c,oc均可输出

  8. 字符串:
    (1)C语言存储:a.字符数组,b.字符指针
    (2)OC:NSString指针变量,只能存储OC字符串的地址
    (3)OC必须加前缀@符号

    NSLog(@"OC使用字符串要加前缀@")
    NSLog(@"我是%@",str)
    
  9. 前缀:NextStep->Cocoa->Foundation框架之中

  10. @符号:将C转为OC字符串,绝大部分关键字以@开头

  11. 注释:和C同

   //单行注释
   /*
   *多行注释
   */
  1. 函数的定义与调用(同C),编译连接执行:

(1)在.m中写代码
(2)使用 编译器将源码编译为目标文件

cc -c xx.m

a.预处理 b.检查语法 c.编译
(3)链接

cc xx.o    //使用框架需要告诉编译器去哪个框架找函数和类
cc xx.o -framework

(4)执行

a.out

以上四步点击运行按钮即可

  1. oc和c的文件名对比:
源文件目标文件可执行文件
C.c.o.out
OC.m.o.out

二、OC的数据类型

  1. 支持所有的C:基本:int double float char;指针:int *p1;构造:数组 结构体 枚举;空类型:void;自定义类型:typeof。
  2. BOOL类型:YES和NO中的一个(条件表达式结果),占一个字节,1个有符号的char变量
  3. Boolean:存储true或false(条件表达式结果),无符号,不常用
  4. class类型,类,可以直接调用
  5. id类型 万能指针
  6. nil类型:同C指针NULL,基本数据默认0,不指向地址
  7. SEL方法选择器
  8. 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中:

  1. 如果不在同一个文件,先引入类#import “Person.h”
  2. 新建一个对象,通过对象调用方法
  3. 调用: [对象 函数方法];
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教学

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值