您的位置:首页 > 移动开发 > IOS开发

iOS基础笔试题-(2)

2020-01-15 09:59 411 查看

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

如下面的代码,

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

 
1 2 3   NSString *obj = [[NSData alloc] init];  

参考答案:

在编译时,我们所声明的

obj
NSString *
类型,因此是
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
是具备运行时特性的,因此在链接时,通过
id
isa
指针可以找到其所属的类,因此最终类型还是通过
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的区别

参考答案:

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

写在最后

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

 

转载于:https://www.cnblogs.com/Horkly/p/5456885.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
banjiati9163 发布了0 篇原创文章 · 获赞 0 · 访问量 15 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: