ios 经典面试案例 (一)

2018-03-27  本文已影响26人  小小鱼类

1、iOS iAP内购审核可能失败的问题##

2、App上架后,如何修改app上显示的公司名称?

1、使用系统的某些block api(如UIView的block版本写动画时),是否也考虑引用循环问题?##


[UIView animateWithDuration:duration animations:^{ [self.superview layoutIfNeeded]; }]; 

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ self.someProperty = xyz; }]; 

[[NSNotificationCenter defaultCenter] addObserverForName:@"someNotification" 

                                                 object:nil 

                          queue:[NSOperationQueue mainQueue]

                                             usingBlock:^(NSNotification * notification) {

                                                   self.someProperty = xyz; }]; 

但如果你使用一些参数中可能含有 ivar 的系统 api ,如 GCD 、NSNotificationCenter就要小心一点:比如GCD 内部如果引用了 self,而且 GCD 的其他参数是 ivar,则要考虑到循环引用:

__weak __typeof__(self) weakSelf = self;

dispatch_group_async(_operationsGroup, _operationsQueue, ^

{

__typeof__(self) strongSelf = weakSelf;

[strongSelf doSomething];

[strongSelf doSomethingElse];

} );

类似的:

 __weak __typeof__(self) weakSelf = self;

 _observer = [[NSNotificationCenter defaultCenter] addObserverForName:@"testKey"

                                                               object:nil

                                                                queue:nil

                                                           usingBlock:^(NSNotification *note) {

     __typeof__(self) strongSelf = weakSelf;

     [strongSelf dismissModalViewControllerAnimated:YES];

 }];

self —> _observer —> block —> self 显然这也是一个循环引用。

检测代码中是否存在循环引用问题,可使用 Facebook 开源的一个检测工具 FBRetainCycleDetector 。

4、如何用GCD同步若干个异步调用?(如根据若干个url异步加载多张图片,然后在都下载完成后合成一张整图

使用Dispatch Group追加block到Global Group Queue,这些block如果全部执行完毕,就会执行Main Dispatch Queue中的结束处理的block。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, queue, ^{ /*加载图片1 */ });

dispatch_group_async(group, queue, ^{ /*加载图片2 */ });

dispatch_group_async(group, queue, ^{ /*加载图片3 */ }); 

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

        // 合并图片

});

题的搬运,不成敬意!

上一篇 下一篇

猜你喜欢

热点阅读