admin 管理员组

文章数量: 887032


2024年1月13日发(作者:java虚拟机与平台无关)

ios面试笔试题及答案

iOS是由苹果公司为移动设备所开发的操作系统,支持的设备包括iPhone、iPod touch、iPad、Apple TV,我们一起看看下面的ios面试笔试题及答案吧!

设计模式是什么? 你知道哪些设计模式,并简要表达?

设计模式是一种编码经验,就是用比拟成熟的逻辑去处理某一种类型的事情。

1). MVC模式:Model View Control,把模型 视图 控制器 层进行解耦合编写。

2). MVVM模式:Model View ViewModel 把模型 视图 业务逻辑 层进行解耦和编写。

3). 单例模式:通过static关键词,声明全局变量。在整个进程运行期间只会被赋值一次。

4). 观察者模式:KVO是典型的通知模式,观察某个属性的状态,状态发生变化时通知观察者。

5). 委托模式:代理+协议的组合。实现1对1的反向传值操作。

6). 工厂模式:通过一个类方法,批量的根据已有模板生产对象。

MVC 和 MVVM 的区别

1). MVVM是对胖模型进行的拆分,其本质是给控制器减负,将一些弱业务逻辑放到VM中去处理。

2). MVC是一切设计的根底,所有新的设计模式都是基于MVC进行的改良。

#import跟 #include 有什么区别,@class呢,#import<> 跟

#import””有什么区别?

答:

1). #import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入。

2). @class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含。

3). #import<>用来包含系统的'头文件,#import””用来包含用户头文件。

frame 和 bounds 有什么不同?

frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父view的坐标系统)

bounds指的是:该view在本身坐标系统中的位置和大小。(参照点是本身坐标系统)

Objective-C的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?

答:Objective-C的类不可以多重继承;可以实现多个接口(协议);Category是类别;一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

@property 的本质是什么?ivar、getter、setter 是如何生成并添加到这个类中的

@property 的本质是什么?

@property = ivar + getter + setter;

“属性” (property)有两大概念:ivar(实例变量)、getter+setter(存取方法)

“属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据。 Objective-C 对象通常会把其所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”(aess method)来访问。其中,“获取方法” (getter)用于读取变量值,而“设置方法” (setter)用于写入变量值。

@property中有哪些属性关键字?/ @property 后面可以有哪些修饰符?

属性可以拥有的特质分为四类:

1.原子性--- nonatomic 特质

2.读/写权限---readwrite(读写)、readonly (只读)

3.内存管理语义---assign、strong、 weak、unsafeunretained、copy

4.方法名---getter=、setter=

5.不常用的:nonnull,nullresettable,nullable

属性关键字 readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?

答:

1). readwrite 是可读可写特性。需要生成getter方法和setter方法。

2). readonly 是只读特性。只会生成getter方法,不会生成setter方法,不希望属性在类外改变。

3). assign 是赋值特性。setter方法将传入参数赋值给实例变量;仅设置变量时,assign用于根本数据类型。

4). retain(MRC)/strong(ARC) 表示持有特性。setter方法将传入参数先保存,再赋值,传入参数的retaincount会+1。

5). copy 表示拷贝特性。setter方法将传入对象复制一份,需要完全一份新的变量时。

6). nonatomic 非原子操作。决定编译器生成的setter和getter方法是否是原子操作,atomic表示多线程平安,一般使用nonatomic,效率高。

什么情况使用 weak 关键字,相比 assign 有什么不同?

1.在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比方: delegate 代理属性。

2.自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak;当然,也可以使用strong。

IBOutlet连出来的视图属性为什么可以被设置成weak?

因为父控件的subViews数组已经对它有一个强引用。

不同点:

assign 可以用非 OC 对象,而 weak 必须用于 OC 对象。

weak 说明该属性定义了一种“非拥有关系”。在属性所指的对象销毁时,属性值会自动清空(nil)。

怎么用 copy 关键字?

用途:

1. NSString、NSArray、NSDictionary 等等经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary;

2. block 也经常使用 copy 关键字。

说明:

block 使用 copy 是从 MRC 遗留下来的“传统”,在 MRC 中,方法内部的 block 是在栈区的,使用 copy 可以把它放到堆区.在

ARC 中写不写都行:对于 block 使用 copy 还是 strong 效果是一样的,但写上 copy 也无伤大雅,还能时刻提醒我们:编译器自动对 block 进行了 copy 操作。如果不写 copy ,该类的调用者有可能会忘记或者根本不知道“编译器会自动对 block 进行了 copy 操作”,他们有可能会在调用之前自行拷贝属性值。这种操作多余而低效。

用@property声明的 NSString / NSArray / NSDictionary 经常使用 copy 关键字,为什么?如果改用strong关键字,可能造成什么问题?

答:用 @property 声明 NSString、NSArray、NSDictionary

经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作(就是把可变的赋值给不可变的),为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。

1. 因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本。

2. 如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。

//总结:使用copy的目的是,防止把可变类型的对象赋值给不可变类型的对象时,可变类型对象的值发送变化会无意间篡改不可变类型对象原来的值。

浅拷贝和深拷贝的区别?

答:

浅拷贝:只复制指向对象的指针,而不复制引用对象本身。

深拷贝:复制引用对象本身。内存中存在了两份独立对象本身,当修改A时,Acopy不变。

系统对象的 copy 与 mutableCopy 方法

不管是集合类对象(NSArray、NSDictionary、NSSet ... 之类的对象),还是非集合类对象(NSString, NSNumber ... 之类的对象),接收到copy和mutableCopy消息时,都遵循以下准那么:

1. copy 返回的是不可变对象(immutableObject);如果用copy返回值调用mutable对象的方法就会crash。

2. mutableCopy 返回的是可变对象(mutableObject)。

一、非集合类对象的copy与mutableCopy

在非集合类对象中,对不可变对象进行copy操作,是指针复制,mutableCopy操作是内容复制;

对可变对象进行copy和mutableCopy都是内容复制。用代码简单表示如下:

二、集合类对象的copy与mutableCopy (同上)

在集合类对象中,对不可变对象进行copy操作,是指针复制,mutableCopy操作是内容复制;

对可变对象进行copy和mutableCopy都是内容复制。但是:集合对象的内容复制仅限于对象本身,对集合内的对象元素仍然是指针复制。(即单层内容复制)


本文标签: 对象 属性 方法 复制 使用