最近遇到的面试题(iOS)

1.请问这段程序有什么问题?

@implementation ViewController
- (instancetype)init {
	self = [super init];
	if (self) {
		UIImageView *imgView = [[UIImageView alloc] initwithFrame:self.view.bounds];
		dispatch_async(dispatch_get_global_queue(0, 0), ^{
			[self sleeps60s];
			imgView.image = [UIImage imageNamed:@"img.png"];
			self.view addSubview:imgView];
		});
	}
	return self;
}

- (void)sleep60s {
	sleep(60);
}
@end

问题:imgView.image = [UIImage imageNamed:@“img.png”]; 不应该在子线程修改UI

2.请问这段程序有什么问题

@interface TestView: UIView
@property (nonatomic, strong) NSTimer *timer);
@end

@implementation TestView
- (instancetype)init {
	self = [super init];
	if (self) {
		_timer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer *_Nonnull timer) {
			self.backgroundColor = [UIColor redColor];
		}];
	}
	return self;
}

- (void)dealloc {
	[_timer invalidate];
	_timer = nil;
}
@end

问题:

1.scheduleTimerWithTimeInterval:repeats:block:方法需要在iOS10后才有效
2.self.backgroundColor = [UIColor redColor];这里会造成循环引用,所有不会走dealloc方法

3.UIImage图片加载的两个方法imageNamed:和imageWithContentsOfFile:有什么区别?

答:imageNamed:会把加载过的图片放入缓存中,通常用于加载体积较小或使用频率很高的图片。
imageWithContentsOfFile:每次都从资源文件中加载图片,相对于imageNamed:加载速度更慢,但不会将图片放入缓存中,通常用于加载体积较大的图片或者使用频率很低的图片

4。运行以下代码,请写出打印的结果。

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
[self.view addSubview:view];
view.transform = CGAffineTransformMakeRotation(M_PI/2);
NSLog(@"view.frame.size=%@", NSStringFromCGSize(view.frame.size));
NSLog(@"view.bounds.size=%@", NSStringFromCGSize(view.bounds.size));

答:

view.frame.size={50, 100}
view.bounds.size={100, 50}

5.请问下面UITableViewDataSource的方法的实现有什么问题?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
	UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
	if(!cell) {
		cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
	}
	UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
	cell.contenView addSubview:label];
	label.text = @"string";
	return cell;
}

答:由于cell有重用机制,所以UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
cell.contenView addSubview:label];这两句代码应该放在if里面执行,不然会在每次执行tableView:cellForRowAtIndexPath:时重复添加UILabel

6.Aop的好处与坏处

答:好处:不会入侵代码,可以随意修改全局的代码
坏处:引入第三方时,尤其是不开源的第三方,有可能出现方法名重复的问题,而且很难排查原因

7.系统的定时器方法有什么问题,需要如何解决

答:

8.ios开发时如何选取框架

9.上拉页面稳定出现闪退,如何定位问题,如何解决问题

10.了解原生的苹果推送吗,它是如何实现的

最近遇到的面试题(iOS)_第1张图片
具体流程:https://mp.csdn.net/mdeditor/98973441#

11.对于浅拷贝和深拷贝的理解

答:浅拷贝:只是把对象的指针指向了同一个内存地址中
深拷贝:开辟一块新的内存地址,把内容拷贝到新的地址中,对象指针也是指向新的内存地址

12.数据持久化的方式有哪些,在什么情况下使用

1.NSUserDefaults 2.plist存储 3.归档 4.SQLite3 4.CoreData 5.keychain 6.FMDB

最近遇到的面试题(iOS)_第2张图片## 13.多线程的优点和缺点,实现多线程的方法有哪些
优点:缺点:;方法:1.NSThread 2.NSOperation 3.GCD(全称:Grand Central Dispatch)

14.UIButton的继承关系

继承树:UIButton -> UIControl -> UIView -> UIResponder -> NSObject

NSObject:所有 Objective-C 对象的基类,封装了内存管理,消息的传递机制等底层逻辑
UIResponder:定义了响应和处理事件的接口。
UIView:UIView 定义了一个屏幕上的矩形区域,以及管理这个区域内容的接口。UIView 提供了一个基本行为就是为这个矩形区域填充背景色(Background Color)。
UIControl :不要使用 UIControl 的实例,而是写 UIControl 的子类。UIControl 子类的主要工作就是将 UIResponder 收集到的复杂事件,变成简单的控制事件(UIControl Events)。而为了实现这个过程,UIControl 引入了 Target-Action 机制。
UIButton: 将 UIResponder 接受的 Events 处理成简单事件。

15.self.name=@"name"和_name=@"name"有什么不同

self方法实际上是用了get和set方法间接调用,下划线方法是直接对变量操作。两者的更深层次的区别在于,通过存取方法访问比直接访问多做了一些其他的事情(例如内存管理,复制值等), 例如如果属性在@property中属性的修饰有retain,那么当使用self.xx的时候相应属性,引用计数器由于生成了setter方法而进行加1操作,此时的retaincount为2;同时,使用 下划线是获取不到父类的属性,因为它只是对局部变量的访问。

16.什么是多态

17.HTTP协议中,post和get的区别是什么

18.原子、非原子的区别,readonly的作用和修改

19.NSNotification、Block、Delegate、KVO的区别

20.CollectionView如何实现瀑布流

1.自定义layout
2.重写prepareLayout方法
3.在prepareLayout方法中初始化列高度数组,cell字典信息,delegate
4.重写layoutAttributesForElementsInRect和layoutAttributesForItemAtIndexPath方法
5.设置滑动的contentSize,实现collectionViewContentSize方法

21.富文本图文混排

22.实现图片和文字混排的布局

23.tcp和http的区别

TCP是传输层协议,定义数据传输和连接方式的规范。握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。
HTTP 超文本传送协议(Hypertext Transfer Protocol )是应用层协议,定义的是传输数据的内容的规范。
HTTP协议中的数据是利用TCP协议传输的,特点是客户端发送的每次请求都需要服务器回送响应,它是TCP协议族中的一种,默认使用 TCP 80端口。好比网络是路,TCP是跑在路上的车,HTTP是车上的人。每个网站内容不一样,就像车上的每个人有不同的故事一样。

24.如何实现埋点(非第三方)

一般的埋点分为PV(界面级别的),PA(action事件级别).下边为了减少冗余,简称PV,PA。PV中的数据一般都是静态的,与业务逻辑不相关,比如进入时间,离开时间,是否进入该界面等等。

PA埋点一般都会让所有的controller都继承BaseViewController。这样左右的信息都基于一个类中,符合高聚合的表现。
PV埋点推荐MOAspect。它校于Aspect,有一个功能很重要就是支持相同的方法名注册,而Aspect是不支持不同类相同方法名注册的。

25.Masonry的局限性

1.约束布局相对来说性能比较差(和frame比)
2.

26.tableView的优化

1.使用重用标记符
2.尽量不要使用透明图层
3.尽量减少图层的个数
4.不要使用layer.cornerRadius来设置圆角,图片的话叫UI切图,其他控件使用贝塞尔曲线重画
5.如果cell不需要额外的点击事件,可以用CALayer替代UIView
6.如果cell的高度是固定的话,用tablview的属性rowHeight 来设置高度;如果是动态高度,在网络请求返回后开启子线程计算好对应的高度,用model存储起来
7.使用SDWebImage下载图片时,SDWebImageOptions选择SDWebImageLowPriority,确保tableview在滚动时依然流畅,如果图片需要压缩,在下载完成时开启子线程压缩后再渲染
8.图片尽量使用原始尺寸大小,控件宽高要是整数,避免像素不对齐的情况
9.在渲染图片的时候要考虑CPU和GPU的负载均衡,选择适当的渲染方式

27.在实际开发的过程中,什么情况下需要创建自动释放池?下面代码中有没有什么问题?

Person *p1= [[Person alloc]init];
@autoreleasepool{
	[p1 autorelease];
}
@autoreleasepool{
	[p1 autorelease];
}

28.简述runloop和线程有什么关系

29.简述UIView与CALayer有什么关系及区别

UIView是CALayer的delegate,UIView主要处理事件,CALayer负责绘制,再聊下二者在使用过程中对动画流畅性影响的注意点就superb。

30.请使用OC实现以下算法:一个栈依次压入了1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1将这个栈转置后,从栈顶到栈底为1、2、3、4、5,也就是实现栈中元素的逆序。(只能用递归函数来实现,不能用其他数据结构,如新建栈等)

31.iOS有多继承吗,如果实现多继承的效果,请举例

ios没有多继承,可以利用类别(categories)和协议(delegate)方式来实现

你可能感兴趣的:(iOS)