iOS程序员面试分类模拟23.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
文档标题iOS程序员面试分类模拟23内容iOS程序员面试分类模拟23简答题1使用synonyms和微软雅黑各表示什么正确答案应用场景广泛,具体取决于编程语言的需求例如,如果您是一名Android开发人员,则可能需要使用synonyms来指定动态属性名称,而微软雅黑则用来明确禁止编译器自动合成属性存取方法和默认变量名2Oracle数据库的一个表中有若干条数据,其占用的空间为10M,如果用delete语句删除表中所有的数据,那么此时这个表所占的空间为多大

iOS程序员面试分类模拟23

简答题

1.?@synthesize和@dynamic各表示什么?有什么区别?

正确答案:

@synthesize修饰的属性默认情况下由系统自动合成setter和getter(江南博哥)方法,除非开发者自己定义了这些方法;@synthesize经常用来更改属性的变量名,系统自动合成时默认变量名为_var,即在原变量名前加下画线。

??@dynamic用来明确禁止编译器自动合成属性存取方法和默认变量名_var,由程序员自己手动编写存取方法。

??对于@synthesize和@dynamic,由于前者明确让编译器自动合成存取方法和默认变量名,而后者明确禁止编译器自动合成存取方法和默认变量名,所以两者语义冲突,不可同时使用。

?

2.?Oracle数据库的一个表中有若干条数据,其占用的空间为10M,如果用delete语句删除表中所有的数据,那么此时这个表所占的空间为多大?

正确答案:

10M。数据库中delete操作类似于在Windows系统中把数据放到回收站,还可以恢复。因此,它不会立即释放所占的存储空间。如果想在删除数据后立即释放存储空间,那么可以使用truncate命令。

?

3.?用户下载一个大图片,分成很多份下载,如何使用GCD实现?

正确答案:

使用DispatchGroup追加block到GlobalGroupQueue,这些block如果全部执行完毕,那么就会执行通过dispatch_group_notify添加到主队列中的block,进行图片的合并处理。

??dispatch_queue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

??dispatch_group_tgroup=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(),^{

??//合并图片

??});

?

4.?如何理解GCD死锁?

正确答案:

所谓死锁,通常指两个操作相互等待对方完成,造成死循环,于是两个操作都无法完成,就产生了死锁。下面是一个死锁的代码示例。

??intmain(intargc,constchar*argv[]){

??@autoreleasepool{

??dispatch_sync(dispatch_get_main_queue(),^(void){

??NSLog(@这里死锁了);

??});

??}

??return0;

??}

??这个程序就是典型的死锁。程序将主队列和一个block传入GCD的同步函数dispatch_sync中,等待同步函数执行,直到同步函数返回。但是事实上,这个block永远不会被执行。因为main函数是在主队列中的,它是正在被执行的任务,而主队列中同时只能有一个任务在执行,也就是说只有队头的任务才能被执行。由于主队列是一个特殊的串行队列,它严格遵循FIFO的原则,所以block中的任务必须等到main函数执行完,才能被执行。另外,dispatch_sync函数的特性是,只有block中的任务被执行完毕,才会返回。因此,只要block不被执行,它就不会返回。所以,在这段代码中,main函数等待dispatch_sync函数返回,而dispatch_sync的返回又依赖block执行完毕,block的执行又需要等待main函数的执行结束。这样就造成了三方循环等待,即死锁。

??可以总结出GCD死锁的原因大体有以下两点:

??1)GCD函数未返回,会阻塞正在执行的任务。这里需要强调的是,阻塞(blocking)和死锁(deadlock)是不同的意思。阻塞表示A任务的执行需要等待B任务的完成,称作B会阻塞A,通俗来讲就是强制等待的意思。而死锁表示A任务和B任务相互等待,形成阻塞闭环。

??2)队列中的任务无法并发执行。

??以上两点,如果同时出现,那么就会产生阻塞闭环,形成死锁。所以针对以上情况,只需要消除其中任何一个因素,就可以打破这个闭环,避免死锁。

??解决GCD死锁的方法有以下几种方式:

??1)使用dispatch_async函数。dispatch_async函数是异步函数,具备开启

文档评论(0)

江南博哥 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档