block本质探寻一之内存结构】的更多相关文章

一.代码——命令行模式 //main.m #import <Foundation/Foundation.h> struct __block_impl { void *isa; int Flags; int Reserved; void *FuncPtr; }; struct __main_block_desc_0 { size_t reserved; size_t Block_size; }; struct __main_block_impl_0 { struct __block_impl i…
说明: <1>阅读本问,请参照block前述文章加以理解: <2>环境:ARC: <3>变量类型:基本数据类型或者对象类型的auto局部变量: 一.三种情形 //代码 void test1() { ; __block ; Person *per = [[Person alloc] init]; void(^block)(void) = ^{ NSLog(@"%d %d %p", num, age, per); }; block(); } //打印 -…
一.代码 说明:本文章须结合文章<block本质探寻一之内存结构>和<class和object_getClass方法区别>加以理解: //main.m #import <Foundation/Foundation.h> ; ; int main(int argc, const char * argv[]) { @autoreleasepool { auto ; ; void (^block)(void) = ^{ NSLog(@"a=%d, b=%d, c=%…
一.oc代码 提示:看本文章之前,最好按顺序来看: //代码 void test1() { ; void(^block1)(void) = ^{ NSLog(@"block1----"); }; void(^block2)(void) = ^{ NSLog(@"block2----%d", age); }; NSLog(@"block1-----\n%@ %@ %@ %@", [block1 class], [[block1 class] sup…
说明:阅读本文,请参照之前的block文章加以理解: 一.循环引用的本质 //代码——ARC环境 void test1() { Person *per = [[Person alloc] init]; per.age = ; per.block = ^{ NSLog(@"-------1"); }; } int main(int argc, const char * argv[]) { @autoreleasepool { test1(); // test2(); } NSLog(@&…
说明: <1>阅读本文章,请参照前面的block文章加以理解: <2>本文的变量指的是auto类型的局部变量(包括实例对象): <3>ARC和MRC两种模式均适用: 一.无法修改的原因 //代码 很明显,强行给age赋值会报错: void test1() { ; block = ^{ // age = 20; NSLog(@"%d", age); }; } //打印 -- :: MJ_TEST[:] Program ended with exit c…
说明:阅读本文章,请参考之前的block文章加以理解: 一.栈区block分析 //代码 //ARC void test1() { { Person *per = [[Person alloc] init]; per.age = ; ^{ NSLog(@"age:%d", per.age); }; } NSLog(@"-------1"); } //打印 -- :: MJ_TEST[:] Person dealloc -- :: MJ_TEST[:] -------…
说明: <1>阅读本文,最好阅读之前的block文章加以理解: <2>本文内容:三种block类型的copy情况(MRC).是否深拷贝.错误copy: 一.MRC模式下,三种block类型的copy情况 //代码 void test1() { ; void(^block1)(void) = ^{ NSLog(@"-----"); }; void(^block2)(void) = ^{ NSLog(@"-----%d", age); }; id…
今天在群里看到大佬们在讨论一个面试题,问如下代码在 32bit 和 64bit 系统上分别报什么错误: #import <Foundation/Foundation.h> int main() { void (^block)(void) = nil; block(); return 0; } 虽然有大佬一下子说出了答案,但我仍然一脸懵逼,后来经人提醒,这个考察 block 在内存中的结构,于是赶紧做了如下实验终于弄懂了为什么. 实验 将以上代码保存为 block_test.m ,在命令行编译成…
概述 在iOS开发中Block使用比较广泛,对于使用以及一些常规的技术点这里不再赘述,主要利用C++角度分析Block内部数据底层实现,解开开发中为什么这样编写代码解决问题. Block底层结构窥探 Block本质也是一个OC对象,内部也有isa指针,最终继承NSObject.它是封装了函数调用以及函数调用环境的OC对象. 接下来编写一个Block,利用clang编译器指令可以将我们编写的OC代码转换成C++代码,更好的看清Block底层结构. #import <Foundation/Found…