iOS 面试题整理面试

iOS知识点总结(面试向)更新中

2020-08-21  本文已影响0人  _Luyouli

Swift

1.Swift中structclass的区别

struct SRectangle {
 var width = 200
}
class CRectangle {
 var width = 200
}
1.成员变量
class CRectangle {
    var width = 200
    var height: Int // 报错
}

解释:
struct定义结构体类型时其成员可以没有初始值,如果使用这种格式定义一个类,编译器是会报错的,他会提醒你这个类没有被初始化。

2.构造器
var sRect = SRectangle(width: 300)
sRect.width // 结果是300
var cRect = CRectangle()
// 不能直接用CRectangle(width: 300),需要构造方法
cRect.width // 结果是200

解释:
所有的struct都有一个自动生成的成员构造器,而class需要自己生成

3.指定给另一个变量的行为不同
var sRect2 = sRect
sRect2.width = 500
sRect.width // 结果是300
var cRect2 = cRect
cRect2.width = 500
cRect.width // 结果是500

解释
valueType每一个实例都有一份属于自己的数据,在复制时修改一个实例的数据并不影响副本的数据。而ReferenceType被复制的时候其实复制的是一份引用,两份指向同一个对象,所以在修改一个实例的数据时副本的数据也被修改了。

4.不可变实例的不同
let sRect3 = SRectangle(width: 300)
sRect3.width = 500 // 报错
let cRect3 = CRectangle()
cRect3.width = 500

解释:
struct对于let声明的实例不能对变量进行赋值,class预设值是可以赋值let实例的。注意Swift中常用的StringArrayDictionary都是struct

struct SRectangle {
    var width = 200
    mutating func changeWidth(width: Int) {
        self.width = width
    }
}
class CRectangle {
    var width = 200
    func changeWidth(width: Int) {
        self.width = width
    }
}

解释:
struct的方法要去修改property的值,要加上mutatingclass则不需要。

5.继承

struct不能继承,class可以继承

􏱎􏻊􏰣􏻴􏻵􏺱􏸚􏻶􏻷

2.Swift和Objective-C之间的联系

3.Swift和Objective-C有什么优势?

4.Swift的内存管理是怎样的?

5. Swift支持面向过程编程吗

6.Swift 是一门安全的语言吗

7.为什么在变量类型后面加一个

Swift泛型是什么,解决了什么问题

// 定义一个交换两个变量的函数
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}
 
var numb1 = 100
var numb2 = 200
 
print("交换前数据:  \(numb1) 和 \(numb2)")
swapTwoValues(&numb1, &numb2)
print("交换后数据: \(numb1) 和 \(numb2)")
 
var str1 = "A"
var str2 = "B"
 
print("交换前数据:  \(str1) 和 \(str2)")
swapTwoValues(&str1, &str2)
print("交换后数据: \(str1) 和 \(str2)")

Objective-C

方法和选择器有何不同(methodselector

mallocnew的区别

你是否接触过OC中的反射机制?简单聊一下概率和使用

Class class NSClassFromString@(@"student");
Student *stu = [[class alloc]init];
Class class = [Class class];
NSString *string = NSStringFromClass(class);
SEL selector = NSSelectorFromClass(@"setName");
[stu performSelector:selector withObject:@"Mike"];
NSStingFromSelector(@selector*(setName));

什么是SEL?如何声明一个SEL?通过哪些方法能够调用SEL包装起来的方法

SEL s1 = @selector(test1);//将test1方法包装成SEL对象

调用方法有两种方式:

[person test1]
SEL mod = @selector(test1);
[person performSelector:mod]

协议中<NSObject>是什么意思?子类继承了父类,那么子类会继承父类中遵守的协议吗?协议中能过定义成员变量?如何约束一个对象类型的变量要存储的地址是一个遵守的协议对象

NS/CF/CG/CA/UI这些前缀分别是什么含义

面向对象都有哪些特征以及对你这些特征的理解

我们说的Objective-C是动态运行时语言是什么意思?

readwrite,readonly,assign,retain,copy,nonatomic属性的作用?

简述NotificationCenter、KVO、KVC、Delegate?并说明它们之间的区别?

iOS内省的几个方法?

1.什么是内省?

isMemberOfClass:Class:检查对象是否是那个类但不包括继承类而实例化的对象
isKindOfClass:Class:检查对象是否是那个类或者其继承类实例化的对象
isSubClassOfClass:检查某个类对象是否是另一个类型的子类
respondToSelector:selector:检查对象是否包含这个方法
instancesRespondToSelector::判断类是否有这个方法
conformsToProtocol:是用来检查对象是否实现了指定协议类的方法

分类和扩展有什么区别?可以分别用来做什么?分类有哪些局限性?分类的结构体里面有哪些成员?

Category
Category 是表示一个指向分类的结构体的指针,其定义如下:
typedef struct objc_category *Category;
struct objc_category {
  char *category_name                          OBJC2_UNAVAILABLE; // 分类名
  char *class_name                             OBJC2_UNAVAILABLE; // 分类所属的类名
  struct objc_method_list *instance_methods    OBJC2_UNAVAILABLE; // 实例方法列表
  struct objc_method_list *class_methods       OBJC2_UNAVAILABLE; // 类方法列表
  struct objc_protocol_list *protocols         OBJC2_UNAVAILABLE; // 分类所实现的协议列表
}
通过上面我们可以发现,这个结构体主要包含了分类定义的实例方法与类方法,其中instance_methods 列表是 objc_class 中方法列表的一个子集,而class_methods列表是元类方法列表的一个子集。
但这个结构体里面

根本没有属性列表!
1.分类是用于给原有类添加方法的,因为分类的结构体指针中,没有属性列表,只有方法列表。所以< 原则上讲它只能添加方法, 不能添加属性(成员变量),实际上可以通过其它方式添加属性> ; 
2.分类中的可以写@property, 但不会生成setter/getter方法, 也不会生成实现以及私有的成员变量(编译时会报警告); 
3.可以在分类中访问原有类中.h中的属性; 
4.如果分类中有和原有类同名的方法, 会优先调用分类中的方法, 就是说会忽略原有类的方法。所以同名方法调用的优先级为 分类 > 本类 > 父类。因此在开发中尽量不要覆盖原有类; 
5.如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定;编译器会执行最后一个参与编译的分类中的方法。
为一个类添加额外的原来没有变量,方法和属性 
一般的类扩展写到.m文件中 
一般的私有属性写到.m文件中的类扩展中
①类别中原则上只能增加方法(能添加属性的的原因只是通过runtime解决无setter/getter的问题而已); 
②类扩展不仅可以增加方法,还可以增加实例变量(或者属性),只是该实例变量默认是@private类型的( 
用范围只能在自身类,而不是子类或其他地方); 
③类扩展中声明的方法没被实现,编译器会报警,但是类别中的方法没被实现编译器是不会有任何警告的。这是因为类扩展是在编译阶段被添加到类中,而类别是在运行时添加到类中。 
④类扩展不能像类别那样拥有独立的实现部分(@implementation部分),也就是说,类扩展所声明的方法必须依托对应类的实现部分来实现。 
⑤定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件(头文件)中的类扩展方法为公有的。类扩展是在 .m 文件中声明私有方法的非常好的方式。

OC有多继承吗?没有的话用什么方法可以替代?

include和#import的区别?#import和@class的区别?

Expected specifier-qualifier-list before ‘A’或者Expected specifier-qualifier-list before ‘B’。

一般情况下,在 .h文件中,只需要知道类的名字就可以了,所以用@class,而在 .m文件中通常需要知道类的成员变量即方法,所以要用#import来将类文件导进来。

那为什么不在 .h文件中直接用#import来将文件导入呢,因为如果导入大量的头文件,编译器就会花大量的时间来编译。

需要在.h文件中用#import的情况:

浅复制和深复制的区别?

类变量的@protected,@private,@public,@package声明各有什么含义?

变量的作用域不同

Objective-C与C、C++之间的联系和区别

讲一下atomic的实现机制;为什么不能保证绝对的线程安全?

A:atomic的实现机制
B:atomic为什么不能保证绝对的线程安全?

atomic和nonatomic的区别

Atomic

是默认的
会保证 CPU 能在别的线程来访问这个属性之前,先执行完当前流程
速度不快,因为要保证操作整体完成

Non-Atomic

不是默认的
更快
线程不安全
如有两个线程访问同一个属性,会出现无法预料的结果

简单来说,就是 atomic 会加一个锁来保障线程安全,并且引用计数会 +1,来向调用者保证这个对象会一直存在。假如不这样做,如有另一个线程调 setter,可能会出现线程竞态,导致引用计数降到0,原来那个对象就释放掉了。

id和nil代表什么

nil、Nil,NULL和NSNull区别

block 和 weak 的区别

深入理解block

我理解不深,直接查看资料来源:
iOS中Block实现原理的全面分析

上一篇下一篇

猜你喜欢

热点阅读