iOS. 面试题(一)
一、扩展与分类的区别
1、扩展没有名字,分类有名字
2、扩展可以添加私有变量和私有方法;分类可以在不改变原有类的基础上,为类添加方法,一般用于为系统类添加方法,不能添加成员变量,如果一定要添加成员变量,可以通过runtime动态添加
3、扩展中添加的方法必须实现,分类添加的方法可以不实现
二、简要的说明 UIView 的 frame 和 bounds 的区别
1、frame是view在父试图中的位置和尺寸,它以父试图左上角为坐标原点
2、bounds是基于自身的位置和尺寸,以自己的左上角为坐标原点
三、什么是控制器
1、凡是继承自UIViewController的都是控制器
四、简单的描述控制器的作用
1、处理软件界面的各种事情,并负责软件界面的创建和销毁
五、简单的描述下 Storyboard 的作用
1、用来描述软件界面的
六、简单描述父子控件
每个控件都是一个容器,能容纳小控件,内部小控件是大控件的子控件,大控件是内部小控件的父控件
七、IBOutLet 有什么作用 ?
1、- 被 IBOutlet 修饰的属性能拖线到 Storyboard或xib 中,而且只能修饰属性。
八、IBAction 有什么作用 ?
1、 被 IBAction 修饰的方法能拖线到 Storyboard 或xib中,只能修饰方法返回值类型。
九、 解释下引用资源的时候每个选项的含义 -
1、copy:勾选 copy,会把资源拷贝一份到项目的文件夹中(建议勾选,因为这样修改项目中的资源不会影响源资源)。
2、- Added folder:如果勾选 Create groups,只会会创建一个虚拟的文件夹,程序打包后,安装包中不存在这个文件夹;如果勾选 Create folder references,真的创建一个文件夹,程序打包后,安装包中真的有这个文件夹。
3、Add to targets:要不要把资源打包到软件安装包中去.一定要勾选,不勾选到时候程序打包后,安装包中没有这个资源。
十、UILabel如何设置自动换行
1、label.numberOfLines = 0;
十一、.Character Wrap和Word Wrap的区别
1、character wrap 以字符分割
2、word wrap以单词分割
3、用于label换行是,是以字符换行,还是以单词换行
十二、contentMode的作用
1、一般用来控制图片如何显示
2、contentMode是UIView的属性
typedef NS_ENUM(NSInteger, UIViewContentMode) {
UIViewContentModeScaleToFill, //缩放图片,使图片充满容器,属性会导致图片变形。
UIViewContentModeScaleAspectFit, // 会保证图片比例不变,而且全部显示在ImageView中,这意味着ImageView会有部分空白,不会填充整个区域。
UIViewContentModeScaleAspectFill, // 也会证图片比例不变,但是是填充整个ImageView的,可能只有部分图片显示出来。
//下面的属性都是不会拉伸图片的
UIViewContentModeRedraw, // redraw on bounds change (calls -setNeedsDisplay)
UIViewContentModeCenter, // contents remain same size. positioned adjusted.
UIViewContentModeTop, //将图片放在View中顶部的位置进行调整
UIViewContentModeBottom, //将图片放在View中底部的位置进行调整
UIViewContentModeLeft, //将图片放在View中左边的位置进行调整
UIViewContentModeRight, //将图片放在View中右边的位置进行调整
UIViewContentModeTopLeft, //将图片放在View中左上边的位置进行调整
UIViewContentModeTopRight, //将图片放在View中右上边的位置进行调整
UIViewContentModeBottomLeft, //将图片放在View中左下边的位置进行调整
UIViewContentModeBottomRight, //将图片放在View中右下边的位置进行调整
};
由此可以得出
枚举最前面三个属性是会拉伸(缩放)图片的,其余的属性是不会拉伸图片.
同时可以总结出两点
1.凡是带有scale单词的属性,图片都会被拉伸.
2.凡是带有Ascept单词属性,图片会保持原来的宽高比,即图片不会变形.
最后如果想让图片占满整个父容器,并且不变形,可以采用一种折中的方式
self.leftImageView.contentMode =UIViewContentModeScaleAspectFill;
//超出容器范围的切除掉
self.leftImageView.clipsToBounds = YES;
十三、initWithImage:的作用?
1、通过
initWithImage:创建imageview,imageview的尺寸默认等于传入的图片的尺寸
十四、如何修改一个控件的 frame 属性
1、通过CGRectFrame修改
2、通过结构体赋值
3、利用临时结构体变量;
十五、如何抽取方法
1、把相同的代码抽取到一个方法中,把要变化的作为参数
十六、通过imageNamed:这个方法加载图片有什么特点
1、图片会产生缓存
2、使用场景:图片较小、使用频率较高
3、需要缓存的图片尽量放在Images.xcassets
十七、开发如何选择 UILabel,UIImageView,UIButton
1、能用
UILabel,UIImageView
尽量用
UILabel,UIImageView
,需要和用户交互用
UIButton
十八、什么是自定义控件
1、继承自系统的控件写一个自己的控件,目的是封装控件内部的细节
十九、通过代码如何自定义控件
1、新建一个继承 UIView 的类,(所谓自定义控件就是继承系统自带的控件写一个自己的控件)
2、、在initwithframe方法中添加子控件,(保证别人在外面不管是通过 init 还是initWithFrame 创建都能够添加子控件,因为 init 方法内部会调用initWithFrame)
3、在layoutsubviews设置子控件的frame,因为执行initwightframe方法时,可能父控件还没有frame,所以计算不了子控件的位置和尺寸,而在layoutSubViews 方法,能够拿到当前控件的尺寸
4、提供一个模型属性,重写模型的set方法,保证在别人设置属性的那一刻第一时间拿到数据,设置到子控件上
二十、什么是模型
1、用来存储数据的对象
2、继承自nsobject,在.h文件中声明一些用来存放数据的属性
二十一、instancetype 和 id 的区别
1、instancetype和id都可以代表任意类型
2、instancetype只能作为返回值,id可以作为返回值也可以作为参数,也可以定义变量
3、instancetype会进行类型检测,id不会做类型检测
二十二、@property的使用策略
1、assign:'基本数据类型'、’枚举‘、’结构体‘等非OC对象
2、weak:OC对象类型(比如NSArray、NSDate、NSNumber、模型类)
3、strong:OC对象类型(比如NSArray、NSDate、NSNumber、模型类)
4、一个对象只要被强引用,就不会销毁
二十三、懒加载的好处
1、用到时才创建
2、只加载一次
二十四、如果是通过 xib 或者 Storyboard 创建控件,初始化的操作可以在initWithFrame:方法中做吗?
1、通过xib 或者 Storyboard 创建的控件,初始化时是不会调用initWithFrame方法,会执行initWithCoder方法,初始化完成后执行awakeFromNib方法,建议在wakeFromNib方法中初始化
二十五、通过 alloc/init 或者 alloc/initWithFrame 创建控件会不会主动加载xib?
通过 alloc/init 或者 alloc/initWithFrame 创建控件不会主动加载xib,即使xib名和控件的类名一样
二十六、KVC 的作用
1、可以修改私有变量
2、可以取值
3、可以修改属性
二十七、.如何监听 scrollView 停止滚动? - 1.设置scrollView的代理
- 2.代理对象遵守协议
- 3.实现协议里面
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
二十八、定时器一般有什么作用?以及如何使用定时器
1、可以设置每隔一段时间执行一个事件
1、通过+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo; 创建
2、可以创建一个自动执行任务的定时器
3、可以通过- (void)invalidate停止定时器
二十九、UIScrollView 无法滚动的原因
1、userinterface = NO
2、scrollEnable = No
3、tableview的contentsize没有设置,或者设置的比较小
三十、scrollEnable和 userInteractionEnable 的区别
1、scrollenable = no时,只是不能滚动,他事件依旧能够响应
2、userInteractionEnable = no,禁止任何交互事件
三十一、如何监听 UIScrollView 各种行为 -
1.设置 scrollView的delegate(代理)为控制器对象
2.控制器要遵守协议 UIScrollViewDelegate 协议
3.控制器要实现 UIScrollViewDelegate 协议里面的方法
三十二、代理的注意点 -
1.scrollView的代理可以是任何类型的OC 对象
2.代理一定是weak
三十三、通过约束如何实现动画
- 在修改了约束之后,只要执行下面代码,就能做动画效果
[UIView animateWithDuration:1.0 animations:^{
[添加了约束的view的父控件 layoutIfNeeded];
}];
三十四、67.通过代码自定义cell能在ininWithFrame:方法中添加子控件吗? -
1、不能,自定义cell 是在initWithStyle:reuseIdentifier:方法添加子控件
三十五、设计框架应注意什么
1
三十六、
tableView性能优化 -
1.tableView的缓存机制.
2.在不等高Cell当中,提前计算Cell的行高.提前估一个行高.200-250
3.如果说Cell当中有圆形图片,图片不要用ImageView加载layer.corneadius裁剪去做.会造成离屏渲染. 用绘图Qurarzds裁剪,生成一张圆形的图片.
4.如果说图片的宽高,指定为小数点.会造成锯齿,造成锯齿就会导致离屏渲染 -
5.cell当中的ImageView的大小最好是跟UIImage是一样大,如果不一样大 它会对UIImage做形变操作.cell当中展示都是小图.小图的大小跟ImageView 点击放大,是再去用大的ImageView加载大图.
6.做tableView的时候一定要用真机. -
7.如果是从网络加载数据,一定要放到子线程(异步加载)当中做.
8.加载完毕的数据一定做本地缓存.
9.cell当中不要动态的添加子控件.一般都在创建时,就把要出现的Cell给添加进去,暂时不要显示的,可隐藏.
10.尽量减少Cell内部子控件的个数.
11.如果控件非常多,把不需要与用户进行交互的控件.能过异步绘制出来.生成一张图片.把图片添加到cell当中