前言

下文转载自https://mp.weixin.qq.com/s?__biz=MzA4ODk0NjY4NA==&mid=454115946&idx=1&sn=c7f1b50151b2c1f1383f217cfc373e5f&scene=1&srcid=0415AOiFsX0EZNXa4kelypdA&key=b28b03434249256bc43abf211f946e097bba6a29435ed7523f915e436c4bb17cdbd442a60625aa61c188386f768579ab&ascene=0&uin=MTYwODEwMjY2MA%3D%3D&devicetype=iMac+MacBookPro10%2C1+OSX+OSX+10.11.3+build(15D21)&version=11020201&pass_ticket=Ho6XfSRq5gjEkU%2FiFQVr%2FjCNQcL9jY%2F%2B0J%2BOdP8aUyJaH3CPEGzVnzaIqc6B%2FXQy

1. #import和#include的区别?

 

参考答案:

#import是Objective-C导入头文件的语法,可保证不会重复导入。

#include是C/C++导入头文件的语法,如果是Objective-C与C/C++混编码,对于C/C++类型的文件,还是使用#include来引入,这种写法需要添加防重复导入的语法。

2. @class的作用

 

参考答案:

@class一般用于头文件中通过前向声明,就可以声明了,但是在.m文件中还是需要使用#import进来的。它的作用只是前向声明。

3. 用NSLog函数输出一个浮点类型,结果四舍五入,并保留一位小数

 

参考答案:

float money = 1.011;

NSLog(@"%.1f", money);

使用%f来格式化,其中要保留一位小数,因此再用%.1f就是保留一位。

4.property属性的修饰符有什么样的作用

 

参考答案:

property是属性访问声明,扩号内支持以下几个属性:

getter=getName、setter=setName:设置setter与getter的方法名

readwrite、readonly:设置可供访问级别

assign:方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题

retain:其setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序

copy:其setter方法进行copy操作,与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。

nonatomic:非原子性访问,不加同步, 多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。

5. self.name=@object和name=@object有什么不同?

 

参考答案:

self.name =”object”:会调用对象的setName()方法;name = “object”:会直接把"object"字符串赋值给当前对象的name属性。

6. viewDidLoad、loadView和viewDidUnload何时调用

 

参考答案:

viewDidLoad在view加载完成时调用,loadView在controller的view为nil时调用。对于viewDidUnload现在已经不能直接调用了。

7. objective-c中的可变与不可变词典

 

参考答案:

可变字典就是可以增、删、改操作的字典,对应于NSMutableDictionary类型。

不可变字典就是不能执行增、删、改操作的字典,对应于NSDictionary类型。

8.Objective-C的内存管理

 

参考答案:

现在内存管理几乎都采用ARC,也就是Automatic Reference Counting,意思是自动引用计数。由编译器在编译时自动为添加retain、release等代码。

如果问的MRC,也就是Manual Reference Counting,意思是手动内存管理。

黄金法则:谁使对象的引用计数+1,不再使用该对象时,谁就应该使该对象的引用计数-1。

9. 自动生成getter/setter方法

 

参考答案:

对于以前的代码,那时还没有property,使用这样的方法来创建:

- (void)setName:(NSString *)aName;

- (NSString *)name;

在后面有了property,直接使用@property (nonatomic, copy) NSString *name这样的方法来声明,编译器会自动生成getter/setter方法并生成一个_name成员变量。

10. 什么是MVC

 

参考答案:

我相信大部分人在被问到这个问题时,都会回答M就是Model,V就是View,C就是Controller。这都是停留在概念上的回答,明显没有什么工作经验。对于一个对框架和架构有一定的思想的人,回答时会从项目的耦合度、团队开发如何减少冲突、如何降低团队与团队之间的沟通成本、如何将M、V、C之间按照既定的标准建立沟通的桥梁。

Model用于处理数据,通常来说,Model中会包含多个字段,用于存储数据。但是,Model还会有一部分逻辑,比如说:

@interface TestModel: HYBBaseModel

// 这个是接口返回的字段,1表示XXX,2表示YYY,3表示ZZZ

@property (nonatomic, assign) NSUInteger type;

// 这个不是接口返回的字段,但是由于`type`字段是一个数值,不是`view`需要显示的数据

// 所以我们最好将逻辑统一放到这里来,外部只管获取最终显示需要的值即可。即使哪天接口

// 返回的字段变化或者增加什么新的值,只需要处理这个模型内部就好了。

@property (nonatomic, copy, readonly) NSString relationship;

@end

对于View,不应该包含逻辑,应该根据模型直接获取数据。

对于Controller,大部分交互逻辑都集中到了这里,所有View需要的数据,都是通过Controller提取Model然后交给view去显示数据。

11. 重写getter/setter方法

假设声明属性:

@property (nonatomic, copy) NSString *blogName;

重写这个属性的getter/setter方法:

参考答案:

这里一旦连getter方法也重写,编译器不会给我们自动生成成员变量_blogName,因此我们需要在类的声明中添加一个成员变量_blogName:

@interface Demo () {

NSString *_blogName;

}

@end

在自动内存管理下(ARC):

- (void)setBlogName:(NSString *)aName {

if (_blogName != aName) {

_blogName = nil;

_blogName = [aName copy];

}

}

- (NSString *)blogName {

return _blogName;

}

对于手动内存管理(MRC):

- (void)setBlogName:(NSString *)aName {

if (_blogName != aName) {

[_blogName release];

_blogName = nil;

_blogName = [aName copy];

}

}

- (NSString *)blogName {

return _blogName;

}

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

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

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

参考答案:

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

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类型可以指向任何类型的对象。

参考答案:

我们先看看其定义:

/// 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的重用机制

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

参考答案: 

[[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对象调用任何方法表示什么也不执行,也不会崩溃。

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

 

参考答案:

Category就是所谓的扩展。

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

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

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

 

参考答案:

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

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

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

 

参考答案:

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

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

+ (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中,通知是非常常用的设计模式。它是多对多的关系。关于通知,由于这一节比较重要,单独写成一篇文章,后续发出!

写在最后

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

iOS基础笔试题 - 集锦一的更多相关文章

  1. ios基础笔试题-集锦二

    前言 下文转载自:http://www.henishuo.com/objc-interview-two/ 1.即时聊天App不会采用的网络传输方式 A. UDP B. TCP C. HTTP D. F ...

  2. iOS 基础笔试题

    参考:https://www.jianshu.com/p/1d3496bc5bda 1.#import 跟#include.@class有什么区别?#import<> 跟 #import& ...

  3. 2016最新Java笔试题集锦

    更新时间:2015-08-13         来源:网络         投诉删除 [看准网(Kanzhun.com)]笔试题目频道小编搜集的范文“2016最新Java笔试题集锦”,供大家阅读参考, ...

  4. Java笔试题集锦

    Java笔试题集锦 1.MVC的各个部分都有那些技术来实现?怎样实现? 答:MVC是Model-View-Controller的简写."Model" 代表的是应用的业务逻辑(通过J ...

  5. 经典的Java基础面试题集锦

    经典的Java基础面试题集锦,欢迎收藏和分享. 问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示”main方法不是public的”. 问题:Java里的传引用 ...

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

      Android开发(29)  版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...

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

     标签: androidAndroid基础Android面试题Android笔试题 2015-03-12 15:04 3361人阅读 评论(3) 收藏 举报  分类: Android开发(29)  版 ...

  8. 非常全面的java基础笔试题

    下面是java基础笔试题,当时我去笔试,做了1个小时(80道选择题,后面的简答题就没时间做了),结果很吓人,太挫了,最后被面试官忽悠去培训去了,呵呵.我偷偷把面试题弄了下来,用来学习吧,也希望能对你们 ...

  9. Java基础&笔试题

    这些题目是近期我参加过的笔试题和一些我在网上选的部分题,在这里做笔记,认真去学习,更好的应对后面的招聘.有错误欢迎指出. 一.Java基础部分 1.指针在任何情况下都可进行>,<,> ...

随机推荐

  1. poj——3728 The merchant

    The merchant Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5055   Accepted: 1740 Desc ...

  2. BNU2017校赛

    A(模拟) 题意:求一个特殊图的最大流 分析:画画图发现就是for循环扫一遍 B(LCA) 题意:有n个点组成的树,有q个询问,每个询问(A,B,C),学生从B点走最短路径走到C点,再从C点走到根节点 ...

  3. cogs 66. [HAOI2004模拟] 数列问题

    66. [HAOI2004模拟] 数列问题 ★☆   输入文件:dfs3.in   输出文件:dfs3.out   简单对比时间限制:1 s   内存限制:128 MB 问题描述试编程将 1 至 N ...

  4. 洛谷 P1023 税收与补贴问题

    P1023 税收与补贴问题 题目背景 每样商品的价格越低,其销量就会相应增大.现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最 ...

  5. 怎样删除Tomcat下已经部署的项目

    lz说的是把web项目部署到tomcat之中,要把它删除..很简单,找到webapps文件(tomcat的根目录)下把它删除即可.. 2.Tomcat 6.0\webapps\项目名 只要在把这个目录 ...

  6. C#高级编程四十八天----列表

    C#中的List C#中deList怎么样?List<T>类是ArrayList类的泛型等效类,该类使用大小可按需动态增长的数组实现List<T>泛型接口. 泛型的优点:它为使 ...

  7. iOS xcode6最新提交app方法

    依照之前方式打包.打包成功后.直接submit提交AppStore.然后再选择build,假设上传成功,但在build选择上未出现,你能够耐心等待.有可能要等上一天,然后选择相应的build,直接提交 ...

  8. JavaScript变量提升演示样例

    直接先看两段代码 function getSum() { var sum = a + b; var a = 1; var b = 2; return sum; } getSum(); function ...

  9. Android解析程序包时出现问题

    Android用户下载我们wcc应用时,偶尔会出现“解析程序包出现问题”的的现象,以下是逐步排查的相关经验: 1. 首先确保这个包本身没有问题. 检测方法:其他手机采用同样的下载方式再下载一次. 解决 ...

  10. android7.0 编译问题及解决【转】

    本文转载自:http://blog.csdn.net/zhangmingbao2016/article/details/52699182 注意:Linux操作系统上编译Android 7.0必须使用o ...