(毕业真实)版本《昆士兰大学毕业证书-|UQ真实毕业的证书
anonymous-116166 05/19 26004.0/1
(毕业真实)版本《昆士兰大学毕业证书-|UQ真实毕业的证书
《威斯敏斯特大学毕业证|Westminster大学毕业证》【微/Q:3452791479 --- WeChat:3452791479】《威斯敏斯特大学毕业证|Westminster毕业证》【微/Q:3452791479—— WeChat:3452791479】《成绩单、学历证明、回国人员证明》【留信网认证,本科,硕士,海归,博士,排名,成绩单】代办国外(海外)澳洲英国、澳洲、韩国、美国、新西兰等各毕业证。
《威斯敏斯特大学毕业证|Westminster学位证》【微/Q:3452791479—— WeChat:3452791479】《威斯敏斯特大学毕业证|Westminster学历》【留信网认证,本科,硕士,海归,博士,排名,成绩单】代办国外(海外)澳洲、英国、澳洲、韩国、美国、新西兰等各毕业证。十五年致力于帮助留学生解决无法毕业,无法认证真实的难题;并帮助留学生制作国外Westminster威斯敏斯特大学毕业证-||毕业证(微,微/Q:3452791479—— WeChat:3452791479),成绩单,真实认证、成绩单以及回国所需的真实学位真实认证。
(威斯敏斯特大学毕业证|Westminster硕士毕业证书)【微/Q:3452791479—— WeChat:3452791479】(威斯敏斯特大学毕业证|Westminster本科毕业证书)最近看到了一道Block的面试题,还蛮有意思的,来给大家分享一下。
本文从一道Block面试题出发,层层深入到达Block原理的讲解,把面试题吃得透透的。
题外话:
很多人觉得Block的定义很怪异,很难记住。但其实和C语言的函数指针的定义对比一下,你很容易就可以记住。
// Block
returnType (^blockName)(parameterTypes)
// 函数指针
returnType (*c_func)(parameterTypes)
例如输入和返回参数都是字符串:
(char *) (*c_func)(const char *);
(NSString *) (^block)(NSString *);
好了,下面正式开始~
1. 面试题
1.1 问题1
以下代码存在内存泄露么?
? 不存在
? 存在
- (void)viewDidLoad {
[super viewDidLoad];
NSNotificationCenter *__weak center = [NSNotificationCenter defaultCenter];
id token = [center addObserverForName:UIApplicationDidEnterBackgroundNotification
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification * _Nonnull note) {
[self doSomething];
[center removeObserver:token];
}];
}
- (void)doSomething {
}
答案是存在!
1.1.1 分析
? block中,我们使用到的外部变量有self和center,center使用了__weak说明符肯定没问题。
? center持有token,token持有block,block持有self,也就是说token不释放,self肯定没法释放。
? 我们注意到[center removeObserver:token];这步会把token从center中移除掉。按理说,center和self是不是就可以被释放了呢