iOS开发知识点总结

时间:2021-09-20 19:19:18
 main文件做了这几件事:
1. 创建当前的应用程序
2. 根据4个参数的最后为应用程序设置代理类(默认情况下是AppDelegate)
3. 将appDelegate 和 应用程序 建立关联(指定代理,)
4. 将整个应用程序进程放进系统的runloop中(一个死循环) runloop有两种状态:等待、处理(处理完后接着等待) frame/bounds/center VC 的生命周期(先alloc/init -》loadView加载界面-》viewDidLoad(只执行1遍) -》viewWillAppear -》viewDidAppear-》viewWillDisapper-》viewDidDisappear-》dealloc)
模态写在viewWillDisapper、viewDidDisappear?????? 程序的生命周期 UIAllertController警告视图(sheetAction底部、alertView中部)、警示框方法的封装 响应者链
touch的几个方法触碰事件、 手势(面试第一反应触碰事件及其几个方法)
touchesBegin -> touchesMoved ->touchesEnded ->touchesCancel 检测触摸事件顺序:手指触碰到屏幕(手机硬件)— 》 UIApplication —》window —》VC —》view —》检测所有视图 响应触碰事件顺序:当前点击的点 -》点所在的view-》 父view -》VC- 》window- 》UIApplication —》手机硬件 阻断响应者链方法:userInterractionEnabled = NO; 关闭交互 常见控件中默认关闭交互的是Label、imageView。 手势
7个: 都涉及到2D仿射函数 UIControl及其子类
UISlider/UISegmentedController/UISwitch/UIStepper/ NSString/NSDic/NSArray NSDate/ 等.... MVC的通讯方式 滚动视图UIScrollView
设置可滑动区域 bounds
轮播图、无线循环 导航控制器UINavigationController
UINavigationBar管理一组UINavigationItem,UINavigationItem包含了UIBarButtonItem。 入栈出栈push、pop 取消图片渲染
  [button setImage:[[UIImage imageNamed:@"1.jpg" ] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forState:UIControlStateNormal] ;  定义全局风格使用 :UIApperence TableView
cell的重用机制(面试)
UITableView靠mutableSet来实现重用功能
出屏幕的cell会被添加到mutableSet(集合)中,进入屏幕的cell,先从set中获取,如果获取不到,才创建一个cell。在cell显示之前,给cell赋上相应的内容。 当数据超过一屏(完全出屏)时,滑动时将出屏的加入到重用队列中,每次当你使用单元格.... 必须实现的2个 代理方法
numberOfRowsInSection:(返回)
cellForRowAtIndexPath: 常用的代理方法:
didDeselectRowAtIndexPath:等 cell分为3部分:…
一般使用自定义cell
自适应高度为NSString对象的一个方法
懒加载防止子控件重复加载(面试:懒加载的好处) 传值方式
属性传值:前到后 A—>B
代理传值:后到前 B—>A @protacal协议方法写在B中,制定A为B的代理(黄金法则)
单例传值: 协议方法要求会手写
定义属性的时候修饰词用assign,防止循环引用。 线程安全相关(原子性,非原子性,效率影响)
刷新UI放在主线程(放在main.m),耗时的放在子线程。 copy,retain,区别?
深拷贝(内容)(源对象引用计数不会+1)、浅拷贝(指针)
copyWithZone 属性修饰符:3方面回答 线程安全、引用计数、读写性 dynamic修饰 系统不会提供set、get方法!!!!!!!!!!!!! @class 只导入类名,不编译! 真正实现还得导入#improt
#improt #include 区别

总结整理

〇、常用控件

UI控件 名称 功能
UIButton 按钮 按钮的作用是:支持用户的点击事件,在用户点击后做出响应
UILabel 文本标签 文本标签的作用是显示一串固定的文字
UITextField 文本输入框 例如输入用户名或者是密码的部分,键入内容的区域
UIImageView 图片的显示 用于显示图片,添加图片的
UIScrollview 滚动的控件 如果内容比较多,超出了一个屏幕,就可以用它来显示
UITableView 表格 如果每一行显示的内容格式差不多,就用这个表格控件
UICollectionView 九宫格 如果显示的东西是一块一块的,一格一格的,而且每个格子张的差不多,就用这个控件
UIWebView 网页显示控件 一般用来显示网页,使用它,就可以在手机上浏览网页
UIAlertView 对话框(中间弹框) 从中间弹出一个框提示用户下一步该做
UINavigation 导航条 显示在顶部的条
UIPageControl 分页控件 能显示当前的页码
UITextView 能滚动的文字显示控件 如果文字内容比较多,需要黄航显示,并且需要编辑
UISwitch 开关 yes or no,开与关
UIActionSheet 底部弹框 从底部弹出一个框提示用户下一步该做什么
UIDataPicker 日期选择 选择日期
UIProgressView 进度条 水平进度条,比如显示文件的下载进度,程序的启动进度
UISlider 滑块 在2个数值之间滑动选择,比如调节音量大小
UIActivityIndicator 圈圈 一直在转圈圈,表示让用户等待
UISegementControl 选项卡 在固定的几个选项之间进项选择
UIToolbar 工具条 一般显示在底部或者是键盘的顶部,里面有几个小按钮

一、响应者链

检测触碰视图:触碰到屏幕->UIApplication -> window -> viewController -> view -> 检测所有子视图【直到检测到所触碰的视图】
处理触摸事件:触摸的子视图 -> view -> viewController -> window -> UIApplication->硬件【因为最终的事件处理还是需要硬件来完成】

二、多线程开发(NSthread、NSOperationQueue、GCD)

iOS中实现多线程的方式有四种
2.1、NSThread
轻量级别的多线程技术,需要我们手动来管理线程。提供的方法比较少,例如:串行、并行这些它实现起来相当困难
开辟子线程的方法有两种:
(一)初始化,这个需要我们手动开启线程,也就是调用start方法,并且有返回值,返回的就是NSThread对象。还可以设置线程名称,设置线程的权限等级等一些参数。
(二)另一个是便利构造器的方法开辟子线程,无返回值,会自动启动线程,不需要手动调用start方法。
2.2、NSObject
只要是NSObject的子类或者对象都可以通过调用方法进入子线程和主线程。其实这些方法所开辟的子线程也是NSThread的另一种体现方式。
开辟子线程:-performSelectorInBackground: WithObject:
进入子线程:-performSelectorOnMainThread: WithObject: waitUntilDone:
延时执行方法:-performSelector: WithObject: afterDelay:
2.3、NSOperationQueue
它是将一组事件添加到队列中,如果想让这组事件在主线程中执行,那么就需要主队列 [NSOperationQueue mainQueue]; 如果想将一组事件在子线程中执行那么就需要其他队列 [[NSOperaionQueue alloc] init]; NSOperation就是事件,它本身是一个抽象类,如果需要实现具体操作,需要它的两个子类:NSInvocationOperation和NSBlockOperation;事件本身和线程无关,只是看你将它添加哪种队列中或者将事件放入哪种线程中。如果在队列中想要使得事件顺序执行,需要给事件添加依赖关系,但是添加依赖关系的时候两个事件不能互为依赖。也可以设置事件的优先级来提高它先执行的概率。但是不准确。还可以设置队列的最大并发执行数,来使得事件顺序执行。
2.4、GCD
GCD效率比operationQueue更高一些,功能更强大。目前要替代其他多线程方式的趋势。它处理事件主要是通过队列来执行。
分为两种队列:一种是串行,一种是并行。系统提供给我们的是一种全局队列,一种是主队列。添加事件的函数为dispatch_async(); 一般我们都是用异步添加事件,最重要的原因就是它不会阻塞当前进程。全局队列中所添加的异步事件肯定都是在子线程中的,主队列中添加的事件不管是异步还是同步都是在主线程中。

三、会手写便利构造器

注意autorelease写在哪?

 +(instancetype)personWithName:(NSString *)name andAge:(int)age {
Person *person = [[[Person alloc] initWithName:name andAge:age] autorelease];
return person;
}

四、UITableView、UITableViewController及其常用代理方法

TableView相关代理方法

代理方法:
-(NSInteger)numberOfSectionsInTableView: // 共有多少个分区 (如果不实现该代理方法,默认整个表视图只有一个分区section)
-(NSInteger)tableView:numberOfRowsInSection: // 每个分区返回的行数
-(UITableViewCell *)tableView:cellForRowAtIndexPath: // 定义单元格(样式和数据)
-(void)tableView:didSelectRowAtIndexPath: // 点击cell所响应的代理方法
-(CGFloat)tableView:heightForRowAtIndexPath: // 设置每个cell的高度
-(NSString *)tableView:titleForHeaderInSection: // 为每个分区头添加标题
-(NSArray *)sectionIndexTitleForTableView: // 添加右侧索引条
和编辑有关的代理方法
-(void)setEditing:animated: // 设置表视图的编辑状态,也就是是否可被编辑 (【特别注意】此方法是重写系统方法,不是UITableView的代理方法) -(BOOL)tableView:canEditRowAtIndexPath: // 设置可编辑状态下的表视图 (哪个单元格可编辑)
-(UITableViewCellEditingStyle)tableView:editingStyleForRowAtIndexPath: // 设置编辑样式
-(void)tableView:commitEditingStyle:forRowAtIndexPath: // 编辑完成后执行的代理方法 (删除数据、单元格,添加数据、单元格) -(BOOL)tableView:canMoveRowAtIndexPath: // 设置可以移动的单元格 -(void)tableView:moveRowAtIndexPath:toIndexPath: // 移动完成后执行的代理方法 (原理是先删除原来位置的数据,再把原来位置的数据添加到新位置)

五、OC的内存管理、深拷贝与浅拷贝
深拷贝拷贝的是内容,浅拷贝拷贝的是地址

六、会手写完整的set、get、方法,以及懒加载
【特别注意】setter方法中严禁使用“.”语法。因为为造成死循环。

setter方法:
-(void)setName:(NSString *)name {
_name = name;
}
getter方法:
-(NSString *)name {
return _name;
}
懒加载【本质:重写系统的属性的getter方法】(当我们需要用到该对象的时候再初始化它,起到一个延时加载的作用)
-(NSArray *)dataArray {
if(_dataArray == nil) {
_dataArray = [[NSArray alloc] init] ;
}
return _dataArray;
}

七、UIController及其子类整理
熟悉整个OC及其UI的系统类之间的继承关系
继承关系:NSObject - UIResponder - UIView - UIControl

八、跟坐标有关的bounds、frame、center之间的关系
frame:是自身以其父view上的左上角为坐标原点
bounds:是以其自身左上角为坐标原点

九、整个应用程序的启动流程 、及应用的代理方法

十、会手写一个协议的代理方法
定义属性代理用assign修饰(原因:防止循环引用)

@protocol TestDelegateViewDelagate <NSObject>

//定义一个可选的代理方法
@optional
- (void) passMySelf:(id)testDelegateView exchangeColor:(NSString *)exchangeColor;// @required @end @interface TestDelegateView : UIView @property (nonatomic, assign)id<TestDelegateViewDelagate> delegate;//使用assign不需管理内存,不用规避循环引用 @end

十一、UIScrollewView的常用属性及其代理方法

十二、手写单例(保护线程安全)
保护线程安全:方法锁,GCD中的dispath...
12.1 用互斥锁

static Singleton *singleton = nil
+(Singleton *)sharedSingleton {
@synchronized(self) {
if (singleton == nil) {
singleton = [Singleton alloc] init];
}
}
return singleton;
}

12.2 用GCD

static Singleton *singleton = nil;
+(Singleton *)sharedSingleton {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^ {
if (singleton == nil) {
singleton = [[Singleton alloc] init];
}
});
return singleton;
}

十三、集合视图的常用属性和代理方法(layOut布局类)
UICollectionView有一个布局类

十四、MVC框架
MV之间通信(不能直接通信) CV之间通信(点击事件)
Model:模型
View:视图
ViewController:视图控制器

十五、UINavigationController导航控制器相关的

十六、网络请求 关键类
GET同步、异步(block、代理)请求
POST同步、异步(block、代理)请求

十七、UITableBarController 及其相关控件属性方法

十八、数据持久化方式
①写入文件
②归档反归档
③数据化

数据持久化的方式:

①写入文件 (最大的缺陷:1. 只能就行简单对象的写入,即NSString,NSArray,NSDictionary,NSData 2. 不能进行灵活的单条的操作。每次进行修改的时候,只能整个读取出来,然后修改后,整个写入) (优点是:操作简单方便)
②归档、反归档 (针对复杂对象,缺点也是不能进行灵活的单条操作)
③写入数据库(sqlite3)-轻量级别的数据库(嵌入式数据库) (缺点和优点与上面相反)

十九、动画
动画的原理:思考?

与UIView相关的动画
19.1.1.类方法 动画块
[UIView beginAnimation:context:] // 动画开始
/这里设置动画的一些属性/
[UIView commitAnimation]; // 提交刚才设置好的动画属性,其实是提交之后后动画才开始执行的
19.1.2.类方法 block(一共有四种)
(一)只是动画执行部分
(二)多了一个compilation参数 :是说动画执行完成之后 所要作的操作写在该参数 block中
(三)可以设置options,也就是动画的线性属性等一些相关的配置
(四)spring动画,就是果冻效果,也可以说是弹性效果,多了阻尼和动力两个参数。使动画看起来有弹性,参考scrollView滑动到边缘的时候那种弹性效果
19.1.3.类方法 过渡动画(动画块和block方式都可以实现)
[UIView “transition……”];
19.1.4. 2D仿射变化函数
(一)旋转rotation
(二)缩放scale
(三)位移translation
19.1.5. UIImageView的动画(动图)
19.1.6. UIActivityView的动画(小菊花,加载等待)
与layer层相关的动画
19.2.1. 对锚点和position的认识
19.2.2. layer的相关属性
19.2.3. layer层所有的动画都继承于CAAnimation
19.2.4. CATransition过渡动画
type设置动画效果
subType设置动画方向【特别注意】Fade要配合使用视图的隐藏或者显示属性(hidden)使用
19.2.5. CAPropertyAnimation 也是抽象类,有两个子类 CABasicAnimation、CAKeyFrameAnimation
CABasicAnimation可以通过layer层的旋转、缩放、位移 是通过keyPath属性得到隐式动画。这里记得每一个隐式动画的开始都需要transform开头,因为它设置的是3D仿射变换函数的属性
CAKeyFrameAnimation它主要设置layer层的position属性,也是通过keyPath获得属性路径。
19.2.6. CATransitionGroup是将多个动画组合起来。本身不具备动画特性。
19.2.7. 3D仿射变换函数 它与2D之间的区别为:2D是针对 UIView 的transform来设置的,3D是针对于 layer 的transform来设置的。多了一个Z轴

数据库缓存、动画的大量使用(两大亮点)

二十、多线程
1.进程

系统中正在运行的 一个应用程序就是 一个进程
进程之间是相互独立的
进程只会在内存中开辟内存空间

2.线程(干活的)

线程是进程的基本执行单元,可以说线程是进程的真正执行者
一个进程最少有一个线程【如果一个进程只有一个线程,那么这个线程称为主线程或者UI线程】
一个线程中任务的执行是串行(顺序执行)的
如果想要同时执行多个任务,就需要多个线程,每条线程可以并发(同时)执行不同任务
*注释:这里的同时并不是真正的同时,下面会详细说到

多线程概念:

其实多线程可以理解为多个人,每个人在一个时间只能干一个活,要想一个人干多个任务,那么只能顺序执行。而如果有多个人的话,那么就可以在相同的时间段内让不同的人去干不同的活。所以多线程可以提高程序的执行效率。

多线程原理:

上面的同时我用波浪线画了出来,这里的同时其实只是一个假象,并不是真正的同时。因为CPU只有一个,而所有的运算都需要CPU来进行计算。所以线程在这里被CPU处理的时候同时也只能处理一个,但这里CPU是怎样处理多线程的呢?我们知道CPU的执行效率非常快,CPU在这里其实它是给每个线程分配非常短的时间来快速的在线程之间中来回调度(切换)执行,由于这个时间段非常非常短,所以给我们造成了一个多线程同时被CPU执行的一个假象。

所以,如果线程非常非常多的时候,会消耗大量的CPU资源,而且CPU分配给每个线程的频率也会降低,这样就会造成效率的下降。
所以,一般我们会开辟1-3个线程,最多也不要超过5个。这样就能保证CPU的一个执行效率。

NSThread

NSLog(@“%@”, [NSThread currentThread]); // 打印当前代码段所在的线程
NSLog(@“%@”, [NSThread mainThread]); // 打印主线程的信息

  1. 创建线程
    假设run是一个耗时操作
    (一)创建线程方式一
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
    [thread start];
    (二)创建线程方式二
    [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
  2. 线程的属性(因为只有方式一有对象,所以只适用于方式一)
    thread.name = @“第一个子线程”; // 设置子线程的名称
    thread.threadPriority = 1; // 优先级。参数是一个浮点数,取值范围是0-1。默认值是0.5。开发中一般我们不去修改线程的优先级。
  3. 线程的状态
    (一)阻塞进程
    +(void)sleepUntilDate:(NSDate )date;
    +(void)sleepForTimeInterval:(NSTimeInterval 
    )tl;
    (二)强制停止线程
    +(void)exit; // 一旦强制终止,就不能重新启动代码,而且后面的代码不会执行。

另附一套基础检测题

※ 选择题(共25题,每题3分)
1、以下对响应链说法错误的是:
答案:(A)
A、当事件发生的时候,响应链首先被发送给第一个响应者
B、事件将沿着响应者链一直向下传递,直到被接受并作出处理
C、如果整个过程都没有响应这个事件,则该事件最终要由APP Delegate做出处理
D、一般情况下,在响应链中只要有对象处理事件,事件就会被传递
【A.发送给屏幕,再到应用程序—>.....】
2、以下对多线程开发的理解错误的是:
答案:(C)
A、发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好
B、多线程程序中,一个进程包含2个以上的线程(含2个)
C、大量的线程降低代码的可读性,但不需要更多的内存空间
D、当多个线程对同一个资源出现争夺的时候要注意线程安全的问题
【C.开辟线程会占用内存空间】
3、实现一个生成Student实例对象的便利构造器的正确写法是:
答案:(A)
A、
+ (id)studentWithName:(NSString *)newName andAge:(int)newAge
{
Student *stu = [[[Student alloc] initWithName:newName andAge:newAge] autorelease];
return stu;
}
B、
- (id)studentWithName:(NSString *)newName andAge:(int)newAge
{
Student *stu = [[Student alloc] initWithName:newName andAge:newAge];
return [stu autorelease];
}
C、
- (void)studentWithName:(NSString *)newName andAge:(int)newAge
{
Student *stu = [[Student alloc] initWithName:newName andAge:newAge];
return [stu autorelease];
}
D、
+ (void)studentWithName:(NSString *)newName andAge:(int)newAge
{
Student *stu = [[Student alloc] initWithName:newName andAge:newAge];
return [stu autorelease];
}
【+号类方法,初始化方法都有返回值】
4、获取tableview正在window上显示的cell的indexPath方法是:
答案:(B)
A、- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;
B、- (NSArray *)indexPathsForVisibleRows;
C、- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
D、- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath;
【A.获取cell CD互为取反】
5、下面关于深拷贝与浅拷贝理解正确的是:
答案:(A)
A、深拷贝拷贝的是内容,浅拷贝拷贝的是指针。
B、深拷贝和浅拷贝最大的区别就是子类对象的地址是否改变。
C、深拷贝是对对象本身复制,但是不对对象的属性进行复制。
D、如果子类对象的地址改变那么就是深拷贝。
【B.有歧义 C.内存空间的地址一样 ,指针的地址不一样,但是不能作为唯一判断标准 C.全部拷贝 D.不一定】
6、关于OC内存管理方面说法错误的是:
答案:(B)
A、OC中的内存管理采用引用计数机制
B、autorelease pool 是OC中一种自动的垃圾回收机制
C、alloc、new或copy来创建一个对象,那么你必须调用release或autorelease
D、OC的内存管理机制本质上还是C语言中的手动管理方式,只不过稍加了一些自动方法
【B.autorelease pool 是需要人为或者代码干涉(ARC下需要系统帮助)】
7、以下的代码会出现什么问题:
@implementation Person
- (void)setAge:(int)newAge {
self.age = newAge;
}
@end
答案:(B)
A、会造成循环引用
B、会造成死循环
C、会出现内存泄露
D、会出现野指针
【B.set、get方法中不可以用self. 造成死循环】
8、对于UIScrollViewController,scrollView将开始降速时,执行的方法是:
答案:(D)
A、- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;{ }
B、- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;{ }
C、- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;{ }
D、- (void)scrollViewWillBeginDecelerating:
【A.手指开始拖拽 B.已经静止 C.动画已经停止】
9、以下哪个控件不是继承于UIControl
答案:(D)
A、UIButton
B、UITextField
C、UISlider
D、UITextView
【ABC是, D是继承于UIScrollView】
10、下面对UIView、UIWindow和CALayer理解错误的是:
答案:(C)
A、UIView继承于UIResponder
B、UIResponder继承于NSObject,UIView可以响应用户事件。
C、UIResponder继承与NSObject,CALayer继承于NSObject,CALayer可以响应事件。
D、UIView是用来显示内容的,可以处理用户事件,CALayer是用来绘制内容的,依赖与UIView来进行显示
【C.CALayer不可以响应事件,只负责内容的呈现。】
11、以下关于视图的frame与bounds的理解错误的是:
答案:(A)
A、bounds是指这个view在window坐标系的坐标和大小
B、frame指的是这个view在它superview的坐标系的坐标和大小
C、frame和bounds是UIView中的两个属性(property)。
D、一个是以自身左上角的店为原点的坐标系,一个是以屏幕左上角的点为原点的坐标系。
【A.自身的】
12、以下哪个方法在当程序将要退出时被调用,且通常在此方法里写一些用来保存数据和一些退出前的清理工作。
答案:(B)
A、- (void)applicationExitsOnSuspend:(UIApplication *)application{ }
B、- (void)applicationDidEnterBackground:(UIApplication *)application{ }
C、- (void)applicationWillTerminate:(UIApplication *)application{ }
D、- (void)applicationDidFinishLaunching:(UIApplication *)application{ }
【B.当程序进行保存重要数据垃圾处理的时候都是在进入后台以后做的】
13、很多内置类如UITableViewController的delegate属性都是assign而不是retain,这是为了:
答案:(D)
A、防止造成内存泄露
B、防止出现野指针
C、防止出现过度释放
D、防止循环引用
14、以下不属于ios中实现多线程的方法是:
答案:(D)
A、NSThread
B、NSOperationQueue
C、Grand Central Dispatch(GCD)
D、NSURLRequest
【D是网络请求有关的】
15、对于UISearchBar,要实现实时搜索(即搜索内容实时发生变化时),会执行以下哪个方法:
答案:(C)
A、- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar;
B、- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar;
C、- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ }
D、- (void)searchBarResultsListButtonClicked:(UISearchBar *)searchBar{ }
【searchBar searchBarController 两个控件,多看一下代理方法 】
16、以下关于导航栏外观属性对应的解释错误的是:
答案:(D)
A、barStyle bar的样式
B、translucent bar的透明度
C、backgroundImage bar的背景图片
D、barTintColor bar上控件的颜色
【barTintColor bar本身的前端颜色】
17、当程序从后台将要重新回到前台的时候,会先执行以下哪个方法:
答案:(B)
A、- (void)applicationDidFinishLaunching:(UIApplication*)application{ }
B、- (void)applicationWillEnterForeground:(UIApplication *)application{ }
C、- (void)applicationDidBecomeActive:(UIApplication *)application{ }
D、 - (void)applicationWillTerminate:(UIApplication *)application{ }
【A应用程序加载完毕,做一些配置工作 C进入前端变的活跃 D将要结束】
18、实现一个singleton的类,下面正确的是:
答案:(A)
A、
static LOSingleton * shareInstance;
+ ( LOSingleton *)sharedInstance{
@synchronized(self){
if (shareInstance == nil) {
shareInstance = [[self alloc] init];
}
}
return shareInstance;
}
【+类方法 返回值】
B、
static LOSingleton * shareInstance;
- ( LOSingleton *)sharedInstance{
@synchronized(self){
if (shareInstance == nil) {
shareInstance = [[self alloc] init];
}
}
return shareInstance;
}
C、
+ (LOSingleton *) sharedInstance
{
LOSingleton *sharedInstance = nil ;
static dispatch_once_t onceToken;
dispatch_once (& onceToken, ^ {
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
【少了static】
D、
- (LOSingleton *) sharedInstance
{
static LOSingleton *sharedInstance = nil ;
static dispatch_once_t onceToken;
dispatch_once (& onceToken, ^ {
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
19、当应用程序将要进入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了,此时会先执行以下哪个方法:
答案:(D)
A、- (void)applicationDidBecomeActive:(UIApplication *)application{ }
B、- (void)applicationDidEnterBackground:(UIApplication *)application{ }
C、- (void)applicationWillTerminate:(UIApplication *)application{ }
D、- (void)applicationWillResignActive:(UIApplication *)application{ }
20、应用程序启动顺序正确的是:
①在UIApplication代理实例中重写启动方法,设置第一个ViewController
②程序入口main函数创建UIApplication实例和UIApplication代理实例
③在第一个ViewController中添加控件,实现对应的程序界面。
答案:(B)
A、①②③
B、②①③
C、①③②
D、③①②
【考察应用程序启动流程】
21、对于UICollectionViewController,实现定义每个元素的margin(边缘 上-左-下-右) 的方法是:
答案:(B)
A、
- (CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
return CGSizeMake();
}
B、
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
return UIEdgeInsetsMake();
}
C、
- (CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section
{
return CGSizeMake();
}
D、
- (CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section
{
return CGSizeMake();
}
【请熟悉集合视图的代理方法】
22、以下对于UIScrollView的属性,说法错误的是:
答案:(D)
A、bounces 控制控件遇到边框是否反弹
B、pagingEnabled 控制控件是否整页翻动
C、scrollEnabled 控制控件是否能滚动
D、contentInset 滚动范围大小
【contentset 滚动范围大小 contentInset设置边框】
23、对于UIScrollViewController,监控目前滚动的位置的属性是:
答案:(A)
A、contentOffSet 偏移量
B、contentSize 滚动范围
C、contentInset 设置边框(上坐下右)
D、scrollIndicatorInsets 滚动条的边框内距
24、在MVC框架中,M与C通讯,通常使用什么方式?
答案:(A)
A、KVO与通知
B、协议-代理
C、类目
D、属性
【协议-代理是C和V之间】
25、对于UILabel,设置单词折行方式的属性是:
答案:(B)
A、textAlignment
B、lineBreakMode
C、numberOfLines 【设置为0,自动换行】
D、sizeToFit 【自适应label】
※ 判断题(共5题,每题5分)
1、UISlider、UISwitch、UITextField这些类都继承于UIControl这个类。
答案:(T)
正确
错误
2、[textField resignFirstResponder]; 表示让文本输入框成为第一响应者, 弹出键盘进入编辑模式。
答案:(F)
正确
错误
【取消第一响应者】
3、[self.view popToViewController: animated: YES];表示弹出一个视图控制器,到指定视图控制器上。
答案:(F)
正确
错误
【pop 出栈 返回】
4、numberOfTapsRequired这个方法能获取到的是有几只手指点击。
答案:(F)
正确
错误
【numberOfTapsRequired 轻拍几次、 numberOfTouchesRequired 获取到的是有几只手指点击】
5、[segmentedControl titleForSegmentAtIndex: ]表示指定索引文字的选项。
答案:(T)
正确
错误
[关闭]