OC核心基础快速掌握之万丈高楼平地起
本博旨在最短的时间内的总结最核心的知识,如果有疑问,欢迎进行留言,我会在看到消息后第一时间内回复,如果有错误,欢迎指出,非常感谢。
核心思想
任何语言的学习都需要先掌握最基本的元素:
基本数据类型、集合类型,程序结构,类/属性/方法
一、基本数据类型
1. 数据元素
命名规则:由字母、数字、下划线、$符号组成 大小写敏感
定义变量时候不能使用关键字
基本数据类型(前面6行右边为输出方式):
int %d / %i
short %hd / %hi
long %ld / %li
unsigned int %u
float %f
char %c
double id(通用的指针类型) enum(声明枚举类型)
signed struct union (共用体联合) void(声明函数无返回值或者无参)
2.运算符
- 加减乘除+ - * / %
- += -=
- 自增 a++ ++a
- sizeof()
- , (逗号运算符) 举例:int b=(1=5,a++,a*6) ,结果是36
- 关系运算符(返回结果真为1,假为0) 且> < >= <= 优先级高于 == !=
- 逻辑运算符: 与或非 && || ! (注意:&&前面为假,后面不会进行运算,||前面为真,后面不会进行运算)
- 位运算符 << >>
- 三目运算符 条件? 真语句执行:假语句执行
3.集合类型
NSArray 和 NSMutableArray
NSDictionary和NSMutableDictionary
集合类学习
数组的四种遍历方式
二、程序结构
1. 顺序结构
2. 分支结构
3. 循环结构
三、类/属性/方法
四、常用的#define宏定义
1.定义常量
(1)定义导航栏的高度 竖屏时,导航栏高度为44,这时可以定义一个常量
#define kNavigationBarHeight 44
(2)屏幕的宽度
#define KSCREEN_WIDTH [UISCREEN mainScreen].bounds.size.width
#define KSCREEN_HEIGHT [UISCREEN mainScreen].bounds.size.height
2.内存的安全释放对象
#define SAFE_RELEASE(x) [x release];x=nil
注意尾句没有冒号,这句在dealloc时候调用,delloc时候将对象置为nil,这就释放了该对象的内存区域,防止内存泄漏
3.判断IOS系统版本
(1)当前系统版本号
#define kCurrentSystemVersion [[[UIDevice currentDevice] systemVersion] floatValue]
#define IOS_VERSION_9_OR_LATER (([[[UIDevice currentDevice] systemVersion] floatValue]>=7.0)?(YES):(NO))
(2)当前的系统语言
#define kCurrentLanguage [[NSLocale preferredLanguages]objectAtIndex:0]
4.调试信息
#ifdef DEBUG
# define DLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define DLog(...);
#endif
- VA_ARGS
是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错, 你可以试试。- FILE 宏在预编译时会替换成当前的源文件名 。
- __LINE__宏在预编译时会替换成当前的行号。
- FUNCTION__宏在预编译时会替换成当前的函数名称 有了以上这几个宏,特别是有了__VA_ARGS ,调试信息的输出就变得灵活多了。
5.判断是否是ARC
#if __has_feature(objc_arc)
//使用arc编码
#else
//使用手动内存管理
#endif
6.定义GCD的后台线程和主线程
//后台运行
#define BACK_GCD(block) dispatch_async(dispath_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),block)
//主线程运行
#define MAIN_GCD(block) dispatch_async(dispatch_get_main_queue(),block)
五、面向对象特性
1.构造方法、自定义构造方法、id类型
1.1 id类型
(1)id是一种类型,万能指针,能够指向/操作任何的对象
typedef struce objc_object id;
注意点:在使用id定义的时候,一定要注意id类型默认已经包含了*,所以不需要在加*。
局限性:调用一个不存在的方法,编译器会马上报错。
(2) instancetype类型
- instancetype会让编译器检查实例化对象的准确类型
- instancetype只能用于返回类型,不能当做参数使用
- 相比id类型,instancetype只能用在返回值类型,不能像id一样用在参数类型上
- instancetype比id多一个好处:编译器会检测instancetype的真实类型
1.2构造方法
(1)完整的创建一个对象:Person *p = [Person new];
new分别调用两个方法:alloc(分配空间),init(初始化空间)
(2)重写构造方法
三步:
1.初始化当前列的实例变量之前,初始化父类的
2.初始化当前类的实例变量
3.返回
举例说明
-(id)init{
if (self = [super init]) {
_age = 18;
_weight = 50.0f;
}
return self
}
1.3自定义构造函数
规范:一定是对象方法- 开头
返回值一般是id类型
方法名一般以initWith开头
-(id)initWithName:(NSString *)name andAge:(int)age {
//先做父类事情
if(self = [super init]) {
_name = name
_age = age
}
return self
}
重写:指的是将父类的方法重写实现(子类不需要在声明,其实是内部默认已经声明)
2.函数与方法的区别
2.1方法
方法是Object-C独有的一种结构,只能在Object-C中声明和使用,C语言不能声明、定义和使用。
- 类方法以+号开头,对象方法以-号开头
- 在@interface 和 @end 之间声明,在@implention和 @end之间定义
- 类方法只能有由类来调用,对象方法只能由对象来调用
- 方法声明和实现中用到的数据类型必须使用()括住
2.2函数
函数即C语言中的函数
- 函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有
- 函数调用不依赖对象
- 函数内部不能直接通过成员变量名访问某个对象的成员变量