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

iOS开发基础笔试题-(1)

2020-01-15 09:59 309 查看

前言

以下部分题目来源于网络,笔者在此处收集起来,既是要巩固自我,也希望能够帮助到同样需要的人!参考答案均为笔者所写,其有疑问或者出错之处,请在评论中提出,谢谢!不喜勿喷!

1. #import和#include的区别?

参考答案:

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

2. @class的作用

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

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

参考答案:

 

1 2 3 4   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
    :非原子性访问,不加同步, 多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。

这里有一篇文章介绍:iOS中的property的修饰符如何使用

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
,使用这样的方法来创建:

 
1 2 3 4   - (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
还会有一部分逻辑,比如说:

1 2 3 4 5 6 7 8 9 10 11 12 13   @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方法

假设声明属性:

 
1 2 3   @property (nonatomic, copy) NSString *blogName;  

重写这个属性的

getter/setter
方法:

参考答案:

这里一旦连

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

 
1 2 3 4 5 6 7   @interface Demo () {    NSString *_blogName; }   @end  

在自动内存管理下(

ARC
):

1 2 3 4 5 6 7 8 9 10 11 12   - (void)setBlogName:(NSString *)aName {    if (_blogName != aName) {       _blogName = nil;       _blogName = [aName copy];    } }   - (NSString *)blogName {   return _blogName; }  

对于手动内存管理(

MRC
):

 
1 2 3 4 5 6 7 8 9 10 11 12 13   - (void)setBlogName:(NSString *)aName {    if (_blogName != aName) {       [_blogName release];       _blogName = nil;       _blogName = [aName copy];    } }   - (NSString *)blogName {   return _blogName; }  

 

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

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