iOS基础笔试题-(2)

12. obj在编译时和运行时分别时什么类型的对象

如下面的代码,obj在编译时和运行时分别时什么类型的对象:

1

2

3

NSString *obj = [[NSData alloc] init];

参考答案:

在编译时,我们所声明的objNSString *类型,因此是NSString类型对象。在运行时,由于指针obj所指向的是NSData类型对象的内存,因此实际上是NSData类型的对象。在编译时,这一行代码会转换成类似这样:

1

2

3

4

NSString *obj = ((id (*)(id, SEL))objc_msgSend)([NSData class], @selector(alloc));

obj = ((id (*)(id, SEL))objc_msgSend)((id)obj, @selector(init));

由于在编译时,转换成id,因此可以用NSString *指向NSData对象,而id是具备运行时特性的,因此在链接时,通过idisa指针可以找到其所属的类,因此最终类型还是通过isa确定其所属类型。

13. id声明的对象有什么特性?

id类型可以指向任何类型的对象。

参考答案:

我们先看看其定义:

1

2

3

4

5

6

7

8

9

/// Represents an instance of a class.

struct objc_object {

Class isa  OBJC_ISA_AVAILABILITY;

};

/// A pointer to an instance of a class.

typedef struct objc_object *id;

可其定义可知id类型是一个指向objc_object结构体类型的指针,这个结构体只有一个指向对象无类的指针isa,因此id可以指向任何类型的对象,故其具备运行时特性。

14. iOS设备性能测试

在实际开发中,我们经常需要对应用瘦身,因此对性能的检测是很重要的。

参考答案:

使用Profile-> Instruments ->Time Profiler可以检测性能。

15. Objective-C中有私有方法、私有变量么?

我记得曾经我就被这么问过,不知道大家有没有遇到过。

参考答案:

在类的.m实现文件内声明,就可以作为私有方法、私有变量。但是,并不是绝对的私有,如果外部知道有这么个方法,一样可以调用,而且不会报错。就像苹果公司没有公开出来的API,只要我们通过其它方式了解到api就可以调用。于是苹果审核时经常由于使用了私有api而打回来了。

16. 简述tableview的重用机制

曾经笔者面试时,也被问到这个问题。

参考答案:

1

2

3

[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]

  • 这个方法就是重用机制的核心了。比如,有一个界面可显示10个cell,那么创建10次cell,并给cell指定同样的重用标识(当然,可以为不同显示类型的cell指定不同的标识)并且10个cell将全部都加入到visiableCells数组,reusableTableCells为空.
  • 滚动tableView,当有一个cell完全移出屏幕时,这个cell就会被加入到reusableTableCells。而新出现的那个cell将加入到visiableCells,而这个cell就是被重用的。

如果要让tableview不重用,不设置reuseIdentifier就可以了。

17. nil与NULL的区别

参考答案:

nilC语言的NULL相同,在objc/objc.h中定义。nil表示Objective-C对象的值为空。在C语言中,指针的空值用NULL表示。在Objective-C中,nil对象调用任何方法表示什么也不执行,也不会崩溃。

更详细请阅读笔者的文章:http://www.henishuo.com/nil-nil-null-nsnull-difference/

18. Category是什么,何时使用?

参考答案:

Category就是所谓的扩展。

有时我们需要在一个已经定义好的类中增加一些方法,而不想去重写该类,这时候使用扩展就很好。比如,当工程已经很大,代码量比较多,或者类中已经有很多方法,已经有其他代码调用了该类创建对象并使用该类的方法时,可以使用类别对该类扩充新的方法。

笔者所到公司之处,都会根据公司的UI风格定制一套UI组件,统一全局的风格。本人向来不喜欢用xib/storyboard开发,因为维护成本太高了。我们不能通过继承的方式定制各种组件吧?所以这个时候使用扩展是最佳时期。

19. 什么是Delegate?常用场景?

参考答案:

Delegate就是所谓的代理,代理是一种设计模式。在iOS开发中,会使用到大量的代理,而代理设计模式是苹果中的标准设置模式。

常用场景有反向传值。比如:苹果的蓝牙,我们进入到下一个界面去打开或者关闭蓝牙,当操作之后需要将状态反馈到前一个界面,并更新显示。对于这种状态,使用代理设计模式是很标准的模式。

20. 什么是单例,如何设计单例?

参考答案:

单例就是全局都只有一个对象存在,而且是在整个App运行过程中都存在。每个App都会有单例,比如UIApplication。而我们在做用户数据存储时,通常都会用单例存储,因为应用在所有操作中,经常要求先登录。

下面这种写法是最常用的写法,这个是线程安全的。

1

2

3

4

5

6

7

8

9

10

11

12

13

+ (instancetype)shared {

static HYBUserManager *sg_userManager = nil;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

if (sg_userManager == nil) {

sg_userManager = [[HYBUserManager alloc] init];

}

});

return sg_userManager;

}

21. 什么是通知?

参考答案:

iOS中,通知是非常常用的设计模式。它是多对多的关系。关于通知,由于这一节比较重要,单独写成一篇文章,在我的随笔中有详细的解释,感兴趣的可以前去看一看。

写在最后

文章中难免有说得不合理的地方,如果您认为说法不正确或者哪里有错误的地方,请在评论中留言,笔者会在第一时间修正!!!

时间: 2024-12-20 22:51:52

iOS基础笔试题-(2)的相关文章

ios基础笔试题-集锦二

前言 下文转载自:http://www.henishuo.com/objc-interview-two/ 1.即时聊天App不会采用的网络传输方式 A. UDP B. TCP C. HTTP D. FTP FTP:是文件传输协议,是File Transfer Protocol的简称,它的作用是用于控制互联网上文件的双向传输,因此一定不会是即时聊天使用的: UDP:是面向无连接的传输层协议,数据传输是不可靠的,它只管发,不管收不收得到: TCP:是面向连接的,可靠的传输层协议: HTTP:是超文本

iOS基础笔试题集锦

1. #import和#include的区别? #import是指Objective-C导入头文件的语法,可以避免重复导入 #include是指C / C++导入头文件的写法,如果是Objective-C 与 C / C++实行混编,那么还是需要用#include进行导入, 这种写法,需要添加防重复引用的语法 [email protected]的作用 @class是 告诉编译器的某个类的申明,但是在.m文件中还是需要#import进来,它的作用只是前向申明

C/C++基础笔试题1.1.1(运算符十问)

本文似乎都是问题,意在引起思考,回忆,主题是运算符,另外这些问题是没有特别的逻辑上的关系,只是我想到的就问了,虽然是随便问,但是你能不能随便答呢?. 运算符,我们在每一个程序中都会用到,也是最最基础的基本功,本系列C/C++基础笔试题等,是没有纲要,没有规律的一系列博文. 为什么这样子,因为作者是渣阿,他只能学一点说一点,力求通俗阿,傻瓜但不失主线阿. 1.0写的是字节对齐,没看过有兴趣的朋友可以戳这里.1.1写的是与运算符相关的内容,你最"熟悉"的"朋友". 首先

C/C++基础笔试题1.0(字节对齐)

传说中博文标题带有笔试.面试等点击率都会很高呢?我也试试! 众生皆是码农命,我们这种即将战秋招的渣渣,既没有超凡的能力,也没有流弊的项目,怎么破? 唯独苦苦怒刷基础,笔试题,面试题,因为以前常常刷OJ,所以很多面试题的编程题倒是可以解,但是笔试题或者基础题我就不记得了,唯独慢慢回想. 况且,写这种面试题,谁能写得赢JULY神. 今天首先讲得是字节对齐. 注意:我是一个渣,所以我只能按自己的理解来说了(要不然怎么会这么惨呢?).如果你想看大神的解释,请看这里 来看个题目 #include <ios

2015 IOS iOS基础面试题(一)——在蓝懿教育

iOS如何面试 iOS基础面试题(二) iOS基础面试题(三) iOS基础面试题(四) iOS进阶面试题----Block部分 iOS进阶面试题----多线程部分 iOS进阶面试题----经典10道 iOS面试悲剧的应对方法 随着iOS平台开发的职位的增加,笔试.面试也越来越有“套路”,这里我总结了一些面试题,多数是Objective-C的基础知识,适合于面试新人,答案是我自己答的,不准确的地方,欢迎指出. 1.   Object-c的类可以多重继承么?可以实现多个接口么?Category是什么

C/C++基础笔试题1.1.2(运算符十问之解)

上一节写了一篇不负责任的博文,被踩了呢,导致有点失落呢. 其实纯问问题,的确是不好,因为看博文很大一个优势就是为了更直接看到想看的东西. 好啦,回归整题. 1.你脑海中的运算符有哪些,按优先级排个序?  这个问题明显没有标准答案,但是最基本的还是要有吧. 比如+ ,- ,* ,/ ,%, 前++/--,后++/--,=,<, >, << ,>>,(),&,^,|,~以及逗号","域名符"::",&&,||等

iOS基础面试题3

iOS进阶面试题----多线程部分 前言:欢迎大家评论,给出正确地答案 1.Difference between shallow copy and deep copy?浅复制和深复制的区别?答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身.深层复制:复制引用对象本身.意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的

Android开发面试经——4.常见Java基础笔试题

关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44403041 因为Androd使用Java语言来编程的,所以我们做Android开发全面的掌握Java基础是必须的.在面试的过程中,我们发现很多公司发的笔试题有很多知识点都是Java的,搞安卓久了,Java基础的一些知识点也都快忘了,今天就让我们来一起复习一些Java基础,希望能在面试中用到: 1.Overload和Override的区别.Overloaded的方法是

Android开发面试经——2.常见Android基础笔试题

关注finddreams博客: http://blog.csdn.net/finddreams/article/details/44219231 正值跳槽的热季,整理一下Android面试中最常考的笔试题,为下次找工作时做好充分准备,这是Android的基础部分: 1.Android四大组件是什么?作用以及应用场景? Android 的四大组件分别是是Activity,Service,BroadcastReceiver和ContentProvider: Activity: 从字面上理解,Acti