什么是OC
是一门动态编程语言 动态在哪?
1.消息机制 在运行时才知道具体去哪运行什么代码
OC后缀是main.m m表示message
OC的对象总是以指针形式出现 绝不会出现在栈上
OC不仅需要编译环境 还需要一个运行时系统来执行编译好的代码 就像操作系统一样 负责对象的生成,释放时的内存管理 为发来的消息查找的对应的处理办法 这些就跟根类NSObject类有关了 根类相当于运行时系统的接口
IOS世界主要两种对象 Objective-C 和 Core Foundation对象 区别不是很大 他们之间可以通过bridge转换
import(include增强版)
区别在于同一个文件无论import多少次 只会包含一次
底层原理:import指令在包含文件的时候会先判断这个文件是否被包含过 如果被包含就略过
框架
框架是一个功能集 苹果或者第三方将一些程序在开发程序的时候经常要用到的功能实现写好 比如cocoa框架,foundation框架 OpenGL框架
将开发和执行软件所必须的图形库,头文件,动态链接库和设定用的各种信息全部汇总在一起就构成了框架
框架提供了程序运行的基本功能和GUI基础
NS为前缀的表示 NextStep
@符号
1.将C字符串转化为OC字符串
"abc"//这是C字符串
@"abc"//这是OC字符串
2.绝大部分关键字都是@开头
编译链接执行
先在first.m中写入规范代码 编译器会进行检测
再通过执行 cc -c first.m 对代码进行预处理 检查语法 编译 形成first.o
之后要进行链接 cc first.o - framework Foundation(框架名称) 告诉计算机 在first.o中用了Foundation的框架 要进行链接 生成a.out
NSLog()(printf增强版)
增强:会输出一些调试信息
执行这段代码的时间
程序的名称
进程的编号
线程的编号
输出的信息
输出完自动换行
当NSLog的参数是一个NSObject类对象时 返回对象的类名和地址
此时NSLog的底层是
1.调用传入对象的description方法
2.拿到这个方法的返回值 返回值是一个字符串
3.将这个字符串输出
A *a = [A new];
NESlog(@"%@",a);//等价于下面
NSString *str = [a description];
NSLog(@"%@",str);
description方法 返回对象的类名和地址
是定义在NSObject中的一个方法 返回的是@“<对象所属类名:对象的地址>”
与C数据类型区别
BOOL和Boolean类型
本质上是 typedef signed char类型
BOOL flag = YES//NO
Boolean flag = true//false
#pragma mark ?分组导航条
#pragma mark 注释名//导航条里的注释
#pragma mark - //一条横线
#pragma mark - 注释名 //效果一样 先横线一行 再下一行注释名
@interface Dog: NSObject
@end
@implementtation Dog
@end
@interface Cat: NSObject
@end
@implementtation Cat
@end
@interface Mouse: NSObject
@end
@implementtation Mouse
@end
#pragma mark Dog statement
@interface Dog: NSObject
@end
#pragma mark Dog define
@implementtation Dog
@end
#pragma mark -
#pragma mark satstatement
@interface Cat: NSObject
@end
#pragma mark Catdefine
@implementtation Cat
@end
#pragma mark - Mouse statement//这样效果一样
@interface Mouse: NSObject
@end
#pragma mark Mousedefine
@implementtation Mouse
@end
static
a. static不能修饰属性也不能修饰方法.
b. static可以修饰方法中的局部变量.
如果方法中局部变量被static修饰 那么这个变量会变成静态变量 存储在常量区 方法执行完毕后不会收回 下次执行这个方法的时候直接使用
@interface A : NSObject
{
static int x;//这样不行
}
- static (void)fun;//这样也不行
@end
@implementation A: NSObject
-(void)fuc
{
static int a = 0;//这样可以
a++;//这样每次使用这个方法的时候都会+1
//并且不同对象的这个方法都是统一用着一个变量 并不会重新创建
}
NSZone 防止内存碎片化引入的结构
对内存分配的区域本身进行多重化管理 根据使用对象的目的 对象的大小分配内存 从而提高内存管理的效率
NSZone* zone
NSZoneMalloc(zone,size);
检查
编译检查看左边 运行检查看右边
编译检查的时候会先看左边指针类型 看这个类型的类是否含有该方法 如果没有就会语法报错
运行检查的时候会先看右边对象类型 看这个类型的类是否含有该方法 如果没有就会运行报错
A *a = [B new];//假设A类有方法funa B类有方法funb
[a funa];
编译检查
当编译器在检查一个对象调用方法时
A *a = [B new];//假设A类有方法funa B类有方法funb
[a funa];//这是在编译检查时允许的 不会有语法报错
[a funb];//这是编译检查时不允许的 会有语法错误
[(B)a funb];//进行强行转换 这样是不会有语法问题的
编译检查一个对象是否可以用相应方法时 主要是看指针的类型 而不是创建对象的类型
运行检查
A *a = [B new];//假设A类有方法funa B类有方法funb
[a funa];//这是在运行检查时不允许的 因为B类中并没有funa方法
[a funb];//这是在运行检查时运行的 在B类中有funb方法
提高调用Objective-c方法的速度 IMP Caching
正常调用是传消息SEL
要加快就在框架初始化的时候就对SEL id IMP进行缓存 这样就不需要找了
id autorelease_class = [NSAutoreleasePool class];
SLE autorelease_sel = @selector(addObject:);
IMP autorelease_imp = [autorelease_class methodForSelector:autorelease_sell];
(*autorelease_imp)(autorelease_class,autorelease_sel,sel);//这样就是直接用SEL id和IMP了
基本概念:
便利构造函数
在内部调用别的构造函数而生成的构造函数叫做便利构造函数