前言
最近应该有很多小伙伴去跳槽面试的吧,相信各位有的已经顺利收到offer了,而有些则是碰壁了,那么我在这里给大家准备了相关面试资料,还有相关算法资料。想了解的可找我拿
block
这一篇我们来研究一下objc的block并回答一下面试中的下列问题:
1.block的内部实现,结构体是什么样的
2.block是类吗,有哪些类型
3.一个int变量被 __block
修饰与否的区别?block的变量截获
4.block在修改NSMutableArray,需不需要添加__block
5.怎么进行内存管理的
6.block可以用strong修饰吗
7.解决循环引用时为什么要用__strong
、__weak
修饰
8.block
发生copy
时机
9.Block
访问对象类型的auto
变量时,在ARC
和MRC
下有什么区别
在回答所有问题之前我们需要了解一些block背景相关的知识. 如下:
- 如何查看Block的内部实现,也就是说转换成背后真正的c/c++代码的block是什么样的?以及转换格式或者原理等.
-关于变量的作用域
Objective-C 转 C++的方法
下面我写了个示例TestClass.m
类其中block代码如下
OC代码:·
@interface TestClass ()
@end
@implementation TestClass
- (void)testMethods {
void (^blockA)(int a) = ^(int a) {
NSLog(@"%d",a);
};
if (blockA) {
blockA(1990);
}
}
@end
经过上述转换操作我们在TestClass.cpp中最下面发现如下代码
C++代码
// @interface TestClass ()
/* @end */
// @implementation TestClass
struct __TestClass__testMethods_block_impl_0 {
struct __block_impl impl;
struct __TestClass__testMethods_block_desc_0* Desc;
__TestClass__testMethods_block_impl_0(void *fp, struct __TestClass__testMethods_block_desc_0 *desc, int flags=0) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
static void __TestClass__testMethods_block_func_0(struct __TestClass__testMethods_block_impl_0 *__cself, int a) {
NSLog((NSString *)&__NSConstantStringImpl__var_folders_wx_b8tcry0j24dbhr7zlzjq3v340000gn_T_TestClass_ee18d3_mi_0,a);
}
static struct __TestClass__testMethods_block_desc_0 {
size_t reserved;
size_t Block_size;
} __TestClass__testMethods_block_desc_0_DATA = { 0, sizeof(struct __TestClass__testMethods_block_impl_0)};
static void _I_TestClass_testMethods(TestClass * self, SEL _cmd) {
void (*blockA)(int a) = ((void (*)(int))&__TestClass__testMethods_block_impl_0((void *)__TestClass__testMethods_block_func_0, &__TestClass__testMethods_block_desc_0_DATA));
if (blockA) {
((void (*)(__block_impl *, int))((__block_impl *)blockA)->Fun