斯堪的纳维亚
斯堪的纳维亚
6月前 · 2 人阅读

牛客网 iOS 题 90-106

90.iOS 中持久化方式有哪些?

  1. 属性列表文件
  2. 对象归档
  3. SQLite 数据库
  4. CoreData

答案:<font color=“LightYellow”>1,2,3,4</font>

1.属性列表文件:即 NSUserDefault 存储,实际是本地生成一个 plist 文件,将所需属性存储在 plist 文件中
2.对象归档:本地创建文件并写入数据,文件类型不限
3.SQLite 数据库:本地创建数据库文件,进行数据处理
4.CoreData:同数据库处理思想相同,但实现方式不同

91.NSURLConnection 类的同步请求方法是?

  1. + sendSynchronousRequest: returningResponse: error:
  2. - initWithRequest: delegate:
  3. - initWithRequest: delegate: startImmediately:

答案:<font color=“LightYellow”>1</font>

2 和 3 都是异步方法,需要设置 delegate 属性

92.NSURLConnectionDelegate 协议中的方法有哪些?

  1. connection: didReceiveData:
  2. connection: didFailWithData:
  3. initWithRequest: delegate:
  4. 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 类似的宏有哪些?

  1. NSAssert1
  2. NSAssert2
  3. NSAssert3
  4. NSAssert4

答案:<font color=“LightYellow”>1,2,3,4</font>

根据 API 有:NSAssert,NSAssert1,NSAssert2,NSAssert3,NSAssert4,NSAssert5

95.iOS 单元测试框架有哪些?

  1. OCUnit
  2. GHUnit
  3. OCMock
  4. NSXML

答案:<font color=“LightYellow”>1,2,3</font>

  • OCUnit 是 OC 官方测试框架,现在被 XCTest 所取代
  • GHUNit 和 OCMock 都是第三方的测试框架
  • NSXML 不属于框架,是 Foundation 框架中的一个类,用于解析 xml 数据

96.NSXMLParser 构造方法有哪些?

  1. initWithContentsOfURL
  2. initWithData
  3. initWithStream
  4. initWithContentsOfFile

答案:<font color=“LightYellow”>1,2,3</font>

本地 xml 文件的解析必须转化成 NSData 才行

97.判断是否为 iPad 设备语句是?

  1. if([[UIDevice currentDevice] userInterFaceIdiom] == UIUserInterfaceIdiomPhone){...}
  2. if([[UIDevice currentDevice] userInterFaceIdiom] != UIUserInterfaceIdiomPhone){...}
  3. 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 控制器的常用方法和属性?

  1. presentPopoverFromBarButtonItem: permittedArrowDirection:animated: 呈现 Popover 视图方法
  2. dismissPopoverAnimated: 关闭 Popover 视图方法
  3. PopoverVisible 判断 Popover 视图是否可见
  4. 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.模态视图专用属性有哪些?

  1. UIModalPresentationFullScreen,全屏状态,是默认呈现样式,iPhone 只能全屏呈现
  2. UIModalPresentationPageSheet,它的宽度是固定的768点,在 iPad 竖屏情况下则全屏呈现
  3. UIModalPresentationFormSheet,它是固定的540x620点,无论是横屏还是竖屏情况下呈现尺寸都不会变化
  4. UIModalPresentationCurrentContext,它与父视图控制器有相同的呈现方式

答案:<font color=“LightYellow”>1,2,3,4</font>

101.NSXML 框架中核心的是 NSXMLParser 和它的委托协议 NSXMLParserDelegate,NSXMLParserDelegate 常用方法有哪些?

  1. parserDidStartDocument
  2. parser:foundCharacters
  3. parser:didStartElement:namespaceURL:qualifiedName:attributes
  4. parser:didEndElement:nameSpaceURL:qualifiedName
  5. 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 操作。

  • 原因分析:网络延时造成程序阻塞,进程在等待网络响应时间过长,出现卡顿现象
  • 改进办法:采用多线程,负责网络的通信任务交给一个专门的后台进程处理
收藏 0
font self first color lightyel
评论 ( 0 )