牛客网 iOS 题 90-106
90.iOS 中持久化方式有哪些?
- 属性列表文件
- 对象归档
- SQLite 数据库
- CoreData
答案:<font color=“LightYellow”>1,2,3,4</font>
1.属性列表文件:即 NSUserDefault 存储,实际是本地生成一个 plist 文件,将所需属性存储在 plist 文件中
2.对象归档:本地创建文件并写入数据,文件类型不限
3.SQLite 数据库:本地创建数据库文件,进行数据处理
4.CoreData:同数据库处理思想相同,但实现方式不同
91.NSURLConnection 类的同步请求方法是?
+ sendSynchronousRequest: returningResponse: error:
- initWithRequest: delegate:
- initWithRequest: delegate: startImmediately:
答案:<font color=“LightYellow”>1</font>
2 和 3 都是异步方法,需要设置 delegate 属性
92.NSURLConnectionDelegate 协议中的方法有哪些?
connection: didReceiveData:
connection: didFailWithData:
initWithRequest: delegate:
connectionDidFinishLoading:
答案:<font color=“LightYellow”>1,2,4</font>
2 属于 NSURLConnectionDelegate
1,4属于 NSURLConnectionDataDelegate
而 NSURLConnectionDataDelegate 的声明:@protocol NSURLConnectionDataDelegate <NSURLConnectionDelegate>
93.单例类 NSNotificationCenter 提供信息广播通知,它采用的是观察者模式的通知机制。
- 对
- 错
答案:<font color=“LightYellow”>1</font>
94.NSAssert 类似的宏有哪些?
- NSAssert1
- NSAssert2
- NSAssert3
- NSAssert4
答案:<font color=“LightYellow”>1,2,3,4</font>
根据 API 有:NSAssert,NSAssert1,NSAssert2,NSAssert3,NSAssert4,NSAssert5
95.iOS 单元测试框架有哪些?
- OCUnit
- GHUnit
- OCMock
- NSXML
答案:<font color=“LightYellow”>1,2,3</font>
- OCUnit 是 OC 官方测试框架,现在被 XCTest 所取代
- GHUNit 和 OCMock 都是第三方的测试框架
- NSXML 不属于框架,是 Foundation 框架中的一个类,用于解析 xml 数据
96.NSXMLParser 构造方法有哪些?
- initWithContentsOfURL
- initWithData
- initWithStream
- initWithContentsOfFile
答案:<font color=“LightYellow”>1,2,3</font>
本地 xml 文件的解析必须转化成 NSData 才行
97.判断是否为 iPad 设备语句是?
if([[UIDevice currentDevice] userInterFaceIdiom] == UIUserInterfaceIdiomPhone){...}
if([[UIDevice currentDevice] userInterFaceIdiom] != UIUserInterfaceIdiomPhone){...}
if([[UIDevice currentDevice] userInterFaceIdiom] == UIUserInterfaceIdiomPad){...}
答案:<font color=“LightYellow”>3</font>
UIUserInterfaceIdiomUnspecified = -1
UIUserInterfaceIdiomPhone //iPhone and iPod touch style UI
UIUserInterfaceIdiomPad //iPad style UI
98.UIPopoverController 控制器的常用方法和属性?
- presentPopoverFromBarButtonItem: permittedArrowDirection:animated: 呈现 Popover 视图方法
- dismissPopoverAnimated: 关闭 Popover 视图方法
- PopoverVisible 判断 Popover 视图是否可见
- popoverArrowDirection 判断 Popover 视图箭头的方向
答案:<font color=“LightYellow”>1,2,3,4</font>
这个类在9.0后被 Deprecated 了
99.UISplitViewController 控制器可以呈现屏幕分栏视图的效果,MasterView 占有320点固定大小。
- 对
- 错
答案:<font color=“LightYellow”>2</font>
从8.0开始,splitViewController 可以在iPhone 中使用,MasterView 的宽度是整个屏幕的宽度,所以不是固定的320.
100.模态视图专用属性有哪些?
- UIModalPresentationFullScreen,全屏状态,是默认呈现样式,iPhone 只能全屏呈现
- UIModalPresentationPageSheet,它的宽度是固定的768点,在 iPad 竖屏情况下则全屏呈现
- UIModalPresentationFormSheet,它是固定的540x620点,无论是横屏还是竖屏情况下呈现尺寸都不会变化
- UIModalPresentationCurrentContext,它与父视图控制器有相同的呈现方式
答案:<font color=“LightYellow”>1,2,3,4</font>
101.NSXML 框架中核心的是 NSXMLParser 和它的委托协议 NSXMLParserDelegate,NSXMLParserDelegate 常用方法有哪些?
- parserDidStartDocument
- parser:foundCharacters
- parser:didStartElement:namespaceURL:qualifiedName:attributes
- parser:didEndElement:nameSpaceURL:qualifiedName
- parserDidEndDocument
答案:<font color=“LightYellow”>1,2,3,4,5</font>
102.网页错误,跳转到 题22
103.用 Objective-C 定义并实现一个基于数组的循环队列,当队列放满需支持动态的拓展队列长度
LoopQueue.h:
#import <Foundation/Foundation.h>
@interface LoopQueue:NSObject
- (instancetype)initWithItem:(NSObject *)item andCapacity:(NSUInteger)capacity;
- (instancetype)init;
- (void)enqueue:(NSObject *)item; // 进队
- (NSObject *)dequeue; // 出队
@end
LoopQueue.m:
#import "LoopQueue.h"
#define DEFAULT_SIZE 10
@interface LoopQueue ()
@property ( nonatomic ) int first;
@property ( nonatomic ) int last;
@property ( nonatomic ) NSUInteger capacity;
@property ( nonatomic ) NSMutableArray *elementData;
@end
@implementation LoopQueue
-( instancetype )initWithItem:( NSObject *)item andCapcity:( NSUInteger )cap
{
self.first = - 1 ;
self.last = - 1 ;
self.capacity = cap;
self.elementData = [ NSMutableArray arrayWithCapacity:cap];
if (item == nil ) {
return self ;
}
[ self.elementData addObject:item];
return self ;
}
-( instancetype )init
{
self = [[ LoopQueue alloc ] initWithItem: nil andCapcity: DEFAULT_SIZE ];
return self ;
}
-( BOOL )isFull
{
return ( _first == 0 && _last == _capacity - 1 ) || _first == _last + 1 ;
}
-( BOOL )isEmpty
{
return self.first == - 1 ;
}
-( void )enqueue:( NSObject *)item
{
if (![ self isFull ]) {
if ( _last == _capacity - 1 || _last == - 1 ) {
self.elementData [ 0 ] = item;
_last = 0 ;
if ( _first == - 1 ){
_first = 0 ;
}
} else {
self.elementData [++ _last ] = item;
}
} else {
self.capacity ++;
self.last ++;
[ self.elementData addObject:item];
}
}
-( NSObject *)dequeue
{
if (![ self isEmpty ]) {
NSObject *tmp = self.elementData [ _first ];
if ( _first == _last ){
_last = _first = - 1 ;
} else if ( _first == _capacity - 1 ){
_first = 0 ;
} else {
_first ++;
}
return tmp;
} else {
NSLog ( @"Fail:Queue is Empty" );
return nil ;
}
}
104.为 UIImageView 添加一个简易的显示远程图片的方法
- (void) setImageWithURL:(NSURL *)url holderImage:(UIImage *)holderImage
图片小于200kb,不用考虑多个 UIImageView 对象的情况
答案:通过 category 给 UIImageView 添加这个个方法,代码如下
- (void) setImageWithURL:(NSURL *)url holderImage:(UIImage *)holderImage {
NSData *data = [NSData dataWithContentsOfURL:url];
if (data) {
holderImage = [UIImage imageWithData:data];
}
}
105.UITableView 需要实现哪些代理?列出 UITableView 代理中必须实现的与其他一些常用的函数。
答案:需要实现的代理有两个
- UITableViewDelegate
- UITableViewDataSource
必须实现的方法两个:
- cellForRowAtIndexpath
- numberOfRowsInSection
查看源代码,@required 是必须要实现的,@optional 是选择实现的
106.小明写了一个基于 TCP 协议的 iOS 聊天工具,随着用户的增多,聊天的过程中不时出现卡顿,程序失去响应的问题,请帮忙分析小明的程序可能出现了什么问题?如果你是小明的话,如何设计程序结构,保证网络的延迟问题不会影响用户的 UI 操作。
- 原因分析:网络延时造成程序阻塞,进程在等待网络响应时间过长,出现卡顿现象
- 改进办法:采用多线程,负责网络的通信任务交给一个专门的后台进程处理