iOS_面试遇到的问题

这篇博客汇总了iOS面试中常见的问题,包括UILabel的布局、UIView上的文字显示、数组的优缺点、集合求交策略、GCD的介绍、UITableView Cell优化、实时数据排序、1像素线绘制、KVC与KVO的底层实现、AFNetworking的内部实现、自动释放池的释放时机、图文混编的使用、__block在ARC和MRC下的差异、桥接转换的作用以及支付安全考虑。这些问题涵盖了iOS开发的多个方面,是面试准备的好资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习东西的方式有很多种, 面试也是一种车缺补漏的方式, 所以, 把遇到的问题总结一下, 感觉考底层实现的多一些:


1.lable 怎么从左上角开始显示内容?

答:

关于这个问题唐巧大神曾写过一篇帖子叙述的相当到位,大致有3种方式:

1.第一种也是比较简单的一种,通过修改label的高度来使文字看起来是从顶部开始显现的,即:

CGSize maximumSize = CGSizeMake(300, 9999);
NSString *dateString = @"The date today is January 1st, 1999";
UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [dateString sizeWithFont:dateFont 
    constrainedToSize:maximumSize 
    lineBreakMode:self.dateLabel.lineBreakMode];
CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height);
self.dateLabel.frame = dateFrame;

如果你使用的是Masobry 的话那就更容易了, 只需设置距上以及距左的距离就可以了, label会根据文字进行自适应的, 当然, 如果需要这样的话需要你设置最大宽度

2.第二种方式是在文字后边加\n 讲文字挤要最上方,即:

for(int i=0; i<newLinesToPad; i++)
    self.text = [self.text stringByAppendingString:@"\n "];

3.第三种是利用category的方式对UILabel进行绘制,即:

// -- file: UILabel+VerticalAlign.h
#pragma mark VerticalAlign
@interface UILabel (VerticalAlign)
- (void)alignTop;
- (void)alignBottom;
@end

// -- file: UILabel+VerticalAlign.m
@implementation UILabel (VerticalAlign)
- (void)alignTop {
    CGSize fontSize = [self.text sizeWithFont:self.font];
    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.size.width;    //expected width of label
    CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];
    int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;
    for(int i=0; i<newLinesToPad; i++)
        self.text = [self.text stringByAppendingString:@"\n "];
}

- (void)alignBottom {
    CGSize fontSize = [self.text sizeWithFont:self.font];
    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.size.width;    //expected width of label
    CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];
    int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;
    for(int i=0; i<newLinesToPad; i++)
        self.text = [NSString stringWithFormat:@" \n%@",self.text];
}
@end


2.view 上怎么显示文字

答:查了一下, 好像CATextlaye能够实现

CATextLayer *lary = [CATextLayer layer];
lary.string = @"dasfasa";
lary.bounds = CGRectMake(0, 0, 320, 20);
lary.font = @"HiraKakuProN-W3"; //字体的名字 不是 UIFont
lary.fontSize = 12.f; //字体的大小
lary.alignmentMode = kCAAlignmentCenter;//字体的对齐方式
lary.position = CGPointMake(160, 410);
lary.foregroundColor = [UIColor redColor].CGColor;//字体的颜色
[self.view.layer addSublayer:lary];

3.数组有什么优缺点?

优点:使用方便,查询效率高,内存为一个连续的区域

缺点:大小固定,不适合动态存储,不方便动态添加

1)数组在内存中是逐个存放的,也就是说倘若数组的第一个元素在地址A,则数组第二个元素就在地址A+1。

而链表则不是,链表每个节点没有相对固定的位置关系。某个节点在地址A其后的节点不一定是A+1,而在内存的其他空闲区域,呈现一种随机的状态。

2)数组一旦显式的被申明后,其大小就固定了,不能动态进行扩充。而链表则可以,可以动态生成节点并且添加到已有的链表后面。

3)链表灵活,但是空间和时间额外耗费较大;数组大小固定,元素位置固定,但是操作不灵活,且容易浪费空间,但是时间耗费较小,尤其是元素变化不大的时候效率很高。双向链表比单向的更灵活,但是空间耗费也更大

4.两个无序的集合, 求交(如果是数组的话有怎么搞)

答:我的一个想法就是把两个集合放在同一个数组里, 然后进行排序, 遍历数组, 判断当前项和下一项是否相同, 相同取出,(这是针对集合的,数组的没想出来)

http://blog.youkuaiyun.com/jie1991liu/article/details/13168255这里提供了更多的一些思路

5.说一下GCD

答:

GCD 其实就是并行,串行,同步, 异步的一个方法, 是基于C语言的一个封装

6.tableView 的Cell 怎么进行优化

答:查了一下, 优化的方式各不相同, 彻底干掉自身重用机制的话太浪费内存了,  So 我觉得在系统方法外边在此包一层缓存机制还是比较可取的一种, 

这个是一个缓存frame的方法, 感觉比我想的缓存cell更加可取http://www.cnphp6.com/archives/67108

一下是一些减少cell卡顿的方式

1)尽量使用不透明视图

2)不重复创建cell

3)减少视图数目

4)不做多余的绘制工作

5)预渲染图片

6)不阻塞主线程

7.怎样对实时更新的数据进行排序

答:此处需要用到双向链表,(具体怎么用,请听下回分解)

8.1像素的线要怎么画

答:感觉这个解释的挺明确的 http://www.cnblogs.com/smileEvday/p/iOS_PixelVsPoint.html
#def ine SINGLE_LINE_WIDTH ( 1 / [UIScreen mainScreen].scale)
#def ine SINGLE_LINE_ADJUST_OFFSET (( 1 / [UIScreen mainScreen].scale) / 2 )

9.kvc kvo的底层实现

答: KVO是基于runtime机制实现的     ,     当某个类的对象第一次被观察时, 系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的 setter 方法。 派生类在被重写的 setter 方法实现真正的通知机制(Person NSKVONotifying_Person)

KVC:KVC主要通过isa- swizzling,来实现其内部查找定位的

一个对象在调用setValue的时候,
(1)首先根据方法名找到运行方法的时候所需要的环境参 数。
(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。
(3)再直接查找得来的具体的方法实现

10.AFN的内部实现

答:

11.自动释放池在什么时候被释放(自动释放池的释放的时间点)

答:当我们使用appKit 创建工程时,程序会自动创建和排空自动释放池的零时对象,通常是时间循环中创建, 结束是排空
ps:这个问题我是真不知道怎么答, 执行看了一下是先对池子中的对象进行release, 然后释放池子

12.图文混编怎么用

答:

13.__block ARC和MRC下的区别

答:__block 在ARC下会引起引用计数+1

14.__bribge  的作用

答:用于Foundat 与 Core Foundation 框架之间转换 即:桥接

15.支付时怎么考虑安全问题

1)请求基于https
2)可多次数据加密

暂时想到的就这么多, 后期在做补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值