1、使用指针的注意点
指针在使用过程中是需要注意一下几点的。
指针类型与指针所指的值类型需一致,不然会出现内存泄露的情况,例如
int a = 255;(1 0000 0000 - 1) // int a = 256;(2的8次方) char *b = &a;
首先a的值如果是255,那这句话这没有什么问题,关键是如果a = 256的话,那就会出现内存泄露的情况。int 在内存中所占用的位数是4位,而char是1位,1位是8个字节,一个字节放一个数字。
指针不能直接赋字节的编号,即地址值,也就是说不能指向一个未知内存中这个地址中的内容,因为有可能这个地址所表示的内容是系统必须的关键值,是拒绝访问的,因而不能直接赋字节编号。
指针不能没有被初始化,没有被初始化的指针的值是垃圾值,也就是野指针,而应用中出现野指针就会导致奔溃。
2、block有时是weak(assign),有时是strong
区分strong、weak的最重要的关键就是,这个对象(block)在我们使用的时候,是否已经被释放,而被释放的信号就是是否还有strong指针指向这个对象。
我们要时刻关心对象在创建的时候,它应该是在什么时候被销毁的,这就是ARC中的内存管理难点。例如
// 我们在使用block代替协议的时候,下一个界面中的block一定是strong修饰的,如果是assign(weak)修饰,则创建之后又没有其他的strong指向它,就会立即被释放,在下次用到的时候则出现野指针(指针指向了已经被释放掉的内存)而导致系统奔溃 @property (nonatomic, strong)block myblock;
3、block(块)的本质是什么?
一个block本质上就是一个函数指针,即那个代码快的内存地址。block常用作传值,实际上就是把block的地址传到要调用block的地方。
下一篇的重点:生成一百个单例对象,如何作内存管理?
单例对象地址不都是静态吗?所以其实就一个内存地址。
那一百个内存地址呢,如何做出有效的内存管理。