1.分类和扩展有什么区别?
类扩展: extension一般用来隐藏类的私有消息,你必须有一个类的源码才能添加一个类的extension,所以对于系统一些类,如nsstring,就无法添加类扩展
能为某个类附加额外的属性,成员变量,方法声明
一般的类扩展写到.m文件中
@interface ViewController()//这就是类扩展的写法,类扩展写在.m文件中
这里写类扩展的私有属性和私有方法的声明,并在@implementation中将扩展方法实现
@end
以上便是类扩展的写法,在.m中添加额外的属性和私有方法
一般的私有属性写到类扩展
分类:分类的小括号中必须有名字
分类只能扩充方法,不能扩展属性和成员变量
2.你知道有哪些情况会导致app崩溃,分别可以用什么方法拦截并化解?
导致app崩溃的原因有很多,比如向某个对象发送其无法响应的方法,数组越界,集合类中添加nil对象,string访问越界,KVO不合理的移除关联key(KVO导致的崩溃不仅仅这一种原因)等。而崩溃非常影响用户体验,所以笔者认为一名高级 iOS 开发应该具备避免这些崩溃的能力,起码至少也要知道这些容易导致崩溃的场景。如可以利用runtime黑魔法—交换方法可以减少程序中的崩溃
3.CocoaPods安装过程:
https://www.cnblogs.com/chuancheng/p/8443677.html
4.对象等同性
思考下面输出什么?
NSString *aString = @"iPhone 8";
NSString *bString = [NSString stringWithFormat:@"iPhone %i", 8];
NSLog(@"%d", [aString isEqual:bString]);
NSLog(@"%d", [aString isEqualToString:bString]);
NSLog(@"%d", aString == bString);
答案是110
==操作符只是比较了两个指针所指对象的地址是否相同,而不是指针所指的对象的值,所以最后一个为0
5.iOS中isKindOfClass和isMemberOfClass的区别
isKindOfClass:确定一个对象是否是一个类的成员,或者是派生自该类的成员.
isMemberOfClass:确定一个对象是否是当前类的成员.
isKindOfClass和isMemberOfClass的应用举例:
UIScrollView *scrollView = [[UIScrollView alloc] init];
if ([scrollView isKindOfClass:[UIView class]]) {
NSLog(@"scrollView is isKindOfClass UIView");
}
if ([scrollView isKindOfClass:[UIScrollView class]]) {
NSLog(@"scrollView is isKindOfClass UIScrollView");
}
if ([scrollView isMemberOfClass:[UIView class]]) {
NSLog(@"scrollView is isMemberOfClass UIView");
}
if ([scrollView isMemberOfClass:[UIScrollView class]]) {
NSLog(@"scrollView isMemberOfClass UIScrollView");
}
输出结果:
scrollView is isKindOfClass UIView
scrollView is isKindOfClass UIScrollView
scrollView isMemberOfClass UIScrollView
6.让UILabel的字体适应指定的宽度,当宽度大时,字体不变, 宽度小时, 字体变小适应宽度
label.adjustsFontSizeToFitWidth = YES;
7.单例
+(instance)shareManager{
static Manager *shareManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
shareManager = [[Manager alloc]init];
});
return shareManager;
}
8.内存泄漏
内存泄漏就是应当废弃的对象在超出其生存周期后继续存在。该被释放的时候未释放,一直被其内部的对象所持有,循环引用就属于内存泄漏。
9.isa指针
isa:是一个Class 类型的指针. 每个实例对象有个isa的指针,他指向对象的类,而Class里也有个isa的指针, 指向meteClass(元类)。元类保存了类方法的列表。当类方法被调用时,先会从本身查找类方法的实现,如果没有,元类会向他父类查找该方法。同时注意的是:元类(meteClass)也是类,它也是对象。元类也有isa指针,它的isa指针最终指向的是一个根元类(root meteClass).根元类的isa指针指向本身,这样形成了一个封闭的内循环。
在arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址
从arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息
从64bit开始,isa需要进行一次位运算,才能计算出真实地址
10.block的属性修饰词为什么是copy?使用block有哪些使用注意?
block一旦没有进行copy操作,就不会在堆上
使用注意:循环引用问题
11.block在修改NSMutableArray,需不需要添加__block?
不需要
当变量是一个指针的时候,block里只是复制了一份这个指针,两个指针指向同一个地址。所以,在block里面对指针指向内容做的修改,在block外面也一样生效。
12.成员变量与属性的联系
本质上,一个属性一定对应一个成员变量,但是属性又不仅仅是一个成员变量,属性还会根据自己对应的属性特性的定义来对这个成员变量进行一系列的封装:提供 Getter/Setter 方法、内存管理策略、线程安全机制等等。
网友评论