OC中的常见关键字
- C语言基本数据类型:
int double float char
- 构造类型:数组 结构体 枚举
- 指针类型:
int *pl
BOOL
类型:可以存储YES
或者NO
Boolean
:存储true
或者flase
class
类型id
类型:万能指针nil
与NULL
在语义上等价SEL
方法选择器block
代码段#import
是#include
指令的增强版,预处理指令
NSLog函数
printf
函数的增强版- 输出一些相关的调试相关信息:代码执行时间、程序名称、进程编号、线程编号、输出的信息
- 自动换行
- 使用注意:加
@
,最后加\n
会自动失效
NSlog(@"hello!")
float f1 = 12.12f;
NSlog(@"this is %f",f1)
NSLog函数占位符
%p
打印指针的值%@
打印指针对应的值,输出的格式:<对象所属的类名:对象的地址>NSLog%@
方法调用传入对象的description的方法,拿到该方法的返回值,这个返回值是一个字符串,将其输出- description方法是定义在NSObject类之中,所以每一个
OC
对象都有这个方法 - 可以通过改写该方法,自定义输出的值
分组导航标记
#pragma mark 分组名
- 就会在导航栏对应的位置显示标题
#pragma mark
- 就会在导航栏对应的位置显示分割线
#pragma mark - 分组名
- 就会在导航栏对应的位置显示分割线再显示标题
多文件开发
- 1个类写在1个模块之中,1个模块至少包含两个文件
.h
头文件:写类的声明,需要引入Foundation
框架.m
实现文件:写上类的实现,引入该模块.h
头文件NewFile Cocoa class
可以自动生成模块文件(两个)
异常处理
@try { // 不能捕获C语言的错误
// 可能发生错误的代码
} @catch(NSException *ex) {
// 错误时执行该代码,输出ex为异常原因
} @finally {
// 都要执行
}
typedef
将长类型定义为段类型,也可以把长的
block
类型定义为短类型
typedef 返回值类型 (^新类型)(参数列表);
typedef void (^NewType)();
NewType block1;
typedef int()(^NewType2)(int num1,int num2);
NewType2 block2;
枚举
typedef enum {
CZMessageTypeMe = 0;
CZMessageTypeOther = 1;
}CZMessageType;
@property(nonatomic, assign) CZMessageType type;
switch
switch (state) {
case 0:
NSLog(@"未发送");
break;
case 1:
NSLog(@"发送中");
break;
case 2:
NSLog(@"已发送");
break;
}
#ifndef和#endif
千万不要忽略了头件的中的
#ifndef
,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include
了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突
还是把头文件的内容都放在#ifndef
和#endif
中吧,不管你的头文件会不会被多个文件引用,你都要加上这个
#ifndef x
//先测试x是否被宏定义过
#define x
//如果没有宏定义下面就宏定义x并编译下面的语句
...
#endif
//如果已经定义了则编译#endif后面的语句
#ifdef OBJC
#ifdef __OBJC__
//判断是否为OC代码
#endif
nil NULL NSNull
NULL
空地址nil
空对象[NSNull null]
数组中可以存储空值
断言
断言(
assertion
)是指在开发期间使用的、让程序在运行时进行自检的代码
NSAssert(myName != nil, @"名字不能为空!");
NSLog(@"My name is %@.",myName);
// 如果myName为空,则输出名字不能为空!,并报错
func
NSLog(@"%s",__func__); // 输出调用该语句的对象和函数
@available版本判断
if (@available(iOS 15.0, *)) {
//版本为ios15
} else {
}
kindof
//返回值为UICollectionViewCell或其子类
- (__kindof UICollectionViewCell *)collectionView {
}
//元素为UIView本身或其子类
@property (nonatomic, strong) NSArray<__kindof UIView *> *viewCollection;
@synthesize
如果同时重写一个属性的get
和set
方法,需要用到@synthesize
@interface MyClass : NSObject
@property (nonatomic, copy) NSString *name;
@end
@implementation MyClass
@synthesize name = _name;
- (void)setName:(NSString *)name {
// 在这里重写setter方法,可以对传入的name进行一些自定义处理
_name = [NSString stringWithFormat:@"My name is %@", name];
}
- (NSString *)name {
// 在这里重写getter方法,可以对_name进行一些自定义处理
return _name;
}
@end