网站建设哪家性价比高,网站系统商城,做借贷网站平台,中国十大发布信息网站排名我们知道#xff0c;内存分为栈#xff0c;堆#xff0c;块。 栈中的内存由系统自己释放#xff0c;堆是存对象初始化的地方#xff0c;块是CPU与内存连接的缓冲器#xff0c;运行速度比内存快#xff0c;比CPU慢。 例如#xff0c;我们NSMutableArray *array [NSMuta…我们知道内存分为栈堆块。 栈中的内存由系统自己释放堆是存对象初始化的地方块是CPU与内存连接的缓冲器运行速度比内存快比CPU慢。 例如我们NSMutableArray *array [NSMutableArrar new]; NSMutableArray *array就在栈中NSMutableArray类型的指针。[NSMutableArray new]开辟的内存在堆中我们可以理解为 NSMutableArray *array ---[NSMutableArrar new]; 栈中的指针指向堆中的对象。 我们用static或者const关键字定义常量一般在内存块中开辟内存空间。在块中开辟内存空间的对象读写速度最快但是我们要注意块的内存很小。 block代码是在块中执行的所以它的运行速度要比delegate等效率高。但是使用block容易造成内存泄露。 原因在网上找到了http://www.cnblogs.com/hanjun/p/3767394.html NSGlobalBlock类似函数位于text段我们可以通过是否引用外部变量识别未引用外部变量即为NSGlobalBlock可以当做函数使用。NSStackBlock位于栈内存函数返回后Block将无效NSMallocBlock位于堆内存NSMallocBlock只需要对NSStackBlock进行copy操作就可以获取。 Block_copy与copy等效Block_release与release等效对Block不管是retain、copy、release都不会改变引用计数retainCountretainCount始终是1NSGlobalBlockretain、copy、release操作都无效NSStackBlockretain、release操作无效必须注意的是NSStackBlock在函数返回后Block内存将被回收。即使retain也没用。容易犯的错误是[[mutableAarry addObject:stackBlock]补在arc中不用担心此问题因为arc中会默认将实例化的block拷贝到堆上在函数出栈后从mutableAarry中取到的stackBlock已经被回收变成了野指针。正确的做法是先将stackBlock copy到堆上然后加入数组[mutableAarry addObject:[[stackBlock copy] autorelease]]。支持copycopy之后生成新的NSMallocBlock类型对象。NSMallocBlock支持retain、release虽然retainCount始终是1但内存管理器中仍然会增加、减少计数。copy之后不会生成新的对象只是增加了一次引用类似retain尽量不要对Block使用retain操作。转载于:https://www.cnblogs.com/hansIOS/p/5228352.html