- #import 只包含一次 预处理
- 框架:功能集,封装好的功能
- 自动释放池,代码写在池中,也可不用池
- NSLog函数,会输出一些调试信息,比如时间,进程:线程编号,会自动换行
- touch main.m cc -c xx.m cc xx.0 -framework ./xx.out
- Bool类型 一字节有符号的char变量 YES1,Boolean 无符号,define宏定义,大部分用bool。
- id类型 万能指针
- 类方法不能直接访问属性,属性是在创建对象的时候一起创建,类加载只有在第一次访问的时候,把类的代码存储在代码段
- 对象方法只能通过对象调用,类方法不能通过self直接调用当前的对象方法
- 类方法节约空间,提高效率,当不需要访问属性或调用其他对象方法的时候定义为类方法
- %p打印指针的水指针变量的值,即地址,%@打印的水指针变量指向的对象
- Instancetype作为返回值,表示返回的是当前这个类的对象
- unichar实际就是unsigned short 占据两个字节 汉字占两个字节, %C
- == 比较的是两个字符串的地址,类型也要相等,字符串常量池
- 创建的对象没有任何指针指向它为匿名对象,指针为名字,匿名对象创建返回的对象的地址,直接使用[[]xx],匿名对象使用一次
- Oc中static不能修饰属性和方法,能修饰方法中的局部变量,变量变成静态变量,存储在常量区,方法执行完毕后不会回收,下次直接使用不用再声明,c中的static可以修饰局部变量,全局变量,修饰函数
- Self是一个指针,在对象方法中指向当前对象,在类方法中self指向当前类,方法中存在同名的局部变量,直接写是访问局部变量, 用self访问当前对象的同名属性
- Super只能用来调用父类的对象方法或类方法,不能访问属性。
- 结构体变量分配在栈空间(一个局部变量),对象分在堆空间
- 类是以calss形式存储在代码段中,调用类的类方法class就可以拿到存储类的类对象地址,调用对象的对象方法class就可以得到存储这个对象所属的类,声明class指针不需要*
- Sel为selector选择器,是一个数据类型,sel对象是用来存储一个方法,方法的本质是一个sel消息,是一个tyoedef类型,不需要*
- 消息机制,调用方法的本质就是为对象发送sel消息
- 点语法在编译器编译的时候会被转换为调用setter方法的代码
- @property,自动生成getter和setter方法的声明,写在interface类的声明之中
- 一个指针指向的对象是一个本类对象是静态类型,不是的话是动态类型(多态)
- 编译的时候检查指针的类型,运行的时候检查对象,编译看左,运行看右
- Nsobject和id都是万能指针,都可以指向任意的oc对象,但id不会进行编译检查,nsobject会,id只能调用对象的方法,不能使用点语法
- Instancetype代表方法的返回值是当前这个类的对象,只能作为方法的返回值,不能在别的地方使用。id既可以声明指针变量,也可以作为参数,也可以作为返回值,id是一个无类型的指针,仅仅是个地址
- Oc中的野指针,指针指向的对象已经被回收了;c语言中的野指针,没有初始化,指向随机空间
- 一个已经被释放的对象,这个对象所占的空间还没有被分配给别人,这样的对象叫做僵尸对象,只要成为僵尸对象,无论如何都不允许访问
- 多线程相关参数,nonatomic效率高,atomic生成setter方法会被加上一线程安全锁
- Import是将指定的文件内容拷贝到写指令的地方,@class并不会拷贝任何内容,只是告诉编译器这是一个类
- 相互引用解决方案,一端retain,一端assign,两边是strong,会内存泄漏,解决方案一端使用strong,一端使用weak
- 当自动释放池结束的时候,仅仅是对存储在自动释放池的对象发送一条release消息,而不是销毁对象,通过类方法创建的对象是已经被autorelease过的
- ARC机制下对象的回收标准,当没有任何强类型的指针指向对象的时候,这个对象会被立即回收
- Retain只能使用在MRC模式下,当属性类型都是oc对象时候,绝大数情况下使用retain,只有出现了循环引用的时候一边retain一边assign,在ARC和MRC模式下都可以使用assign,当属性的类型都是非oc对象时候使用assign
- Strong只能使用在ARC机制上,当属性类型是oc对象时候,绝大多数情况下使用strong,只有循环引用的时候,一段strong,一端weak
- 程序使用ARC机制开发,某些类需要MRC,使用命令 -fno-objc-arc
- 分类的作用,将一个类分为多个模块,分类只能增加方法,不能增加属性,在分类中写property不会自动生成私有属性和gettersetter实现,只会生成getter和setter生命,在分类方法实现中不可以直接访问本类的私有属性,但是可以调用本类的gettersetter来访问属性
- 为系统自带的类写分类为非正式协议,分类作用是可以为一个已经存在的类添加方法
- ARC不是运行时在编译的时候合适地方插入retain,GC垃圾回收机制是在运行期间有个垃圾回收期,不断扫描堆中的对象是否无人使用
- 延展extension是一个特殊的分类,也是类的一部分,延展这个特殊的分类没有名字,只有声明没有实现,和本类共享一个实现,延展没有名字是一个匿名的分类,分类只能新增方法,延展中任意的成员都可以写,延展@propetry,都能生成
- 延展的应用场景,可以为类写一个私有的property,写在延展中的成员,相当于类的私有成员
- Blocks类型的变量中专门存储一段代码,这段代码于有参数,可以有返回值,对 block 修饰 Strong,copy 都可以,建议使用 copy. block 声明默认为栈变量,为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆,所以说为了block属性声明和实际的操作一致,最好声明为copy
- 协议是一系列标准的方法列表,可以被任何类实现.
- 分类方法执行优先级高于本类
- 当方法内部需要执行一个功能,但是这个功能具体的实现函数的内部不确定用block
- 当用字符串常量来初始化字符串指针的时候,这个字符串对象是存储在常量区(数据段)中,当我们调用类方法创建的时候是存储在堆区的
- 当在内存中创建一个字符串对象已获,这个字符串对象的内容就无法更改,当重新为字符串指针初始化值得时候,并不是修改原来的字符串对象,而是重新的创建一个字符串对象,将这个字符串对象的地址重新复制给字符串指针变量,nsmutablestring可以修改,用来做大批量的字符串拼接,效率低下
- Nil本质是0,无法存储到nsarray中
- nsmutablearray是nsarray的扩展,可以动态的新增和删除。
- 在arc的模式下,集合的元素是一个强类型的指针
- Nsrange,cgpoint,cgsize,cgrect都说结构体,它们的变量都说无法存储到集合之中,解决方案是先将结构体变量存储到oc对象中,再加oc对象存储到集合中,nsvalue类的对象就算用来包装结构体变量的
- 若字符串对象存储在常量区,存储在常量区的数据是不允许被回收的,所以存储在常量区的字符串对象的引用计数器是一个超大的数,并且retain和release无效,若字符串存储在堆区,这个字符串对象和普通的对象一样,引用计数器默认是1,字符串如果是浅拷贝,会将对象的引用计数器+1,如果是深拷贝,原来对象的引用计数器不变,新拷贝出来的对象的引用计数器为1
- 想要我们自己的类具备对象拷贝的能力,就要让类遵守nscoping协议并实现copyWithZone这个方法,如果要实现深拷贝,就重新创建一个对象,并将对象的属性值复制返回,如果要实现浅拷贝,那么直接返回self
- 无论如何创建对象,最终都会调用alloc方法来创建对象
【知识】OC笔记零散知识点
最新推荐文章于 2024-05-19 17:49:58 发布