(毕业真实)版本《格里菲斯大学毕业证书-|Griffith真实毕业的证书

anonymous-116166  05/19   2630  
4.0/1 

(毕业真实)版本《格里菲斯大学毕业证书-|Griffith真实毕业的证书

《威斯敏斯特大学毕业证|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是不是就可以被释放了呢