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当中

 

posted on 2018-01-17 18:40  小艾的博客  阅读(143)  评论(0编辑  收藏  举报

导航