iOS面试笔试题ios面试平时生活和工作中的iOS

你能用到的iOS面试题(一)

2016-01-19  本文已影响26543人  没阳光的午后

题目来源自这里,笔者对知识类问题和经验类问题做了解答,答案有遗漏的地方希望大家能补充,这是你能用到的面试题(二)

什么是响应链,它是怎么工作的?

这个问题笔者写过一篇博客,里面有对这个问题的详细解释

如何访问并修改一个类的私有属性?

@interface Father ()
@property (nonatomic, copy) NSString *name;
@end
@implementation Father

- (NSString *)description
{
    return [NSString stringWithFormat:@"name:%@",_name];
}

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    Father *father = [Father new];  
    // count记录变量的数量IVar是runtime声明的一个宏
    unsigned int count = 0;
    // 获取类的所有属性变量
    Ivar *menbers = class_copyIvarList([Father class], &count);
    
    for (int i = 0; i < count; i++) {
        Ivar ivar = menbers[i];
        // 将IVar变量转化为字符串,这里获得了属性名
        const char *memberName = ivar_getName(ivar);
        NSLog(@"%s",memberName);
        
        Ivar m_name = menbers[0];
        // 修改属性值
        object_setIvar(father, m_name, @"zhangsan");
        // 打印后发现Father中name的值变为zhangsan
        NSLog(@"%@",[father description]);
    }

}

iOS Extension 是什么?能列举几个常用的 Extension 么?

如何把一个包含自定义对象的数组序列化到磁盘?

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    User *user = [User new];
    Account *account = [Account new];
    NSArray *userArray = @[user, account];
    // 存到磁盘
    NSData * tempArchive = [NSKeyedArchiver archivedDataWithRootObject: userArray];
}
// 代理方法
- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
        self.user = [aDecoder decodeObjectForKey:@"user"];
        self.account = [aDecoder decodeObjectForKey:@"account"];
    }
    return self;
}
// 代理方法
-(void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.user forKey:@"user"];
    [aCoder encodeObject:self.account forKey:@"account"];
}

Apple Pay 是什么?它的大概工作流程是怎样的?

这个笔者也没有详细了解过,大家可以百度谷歌一下具体的

iOS 的沙盒目录结构是怎样的? App Bundle 里面都有什么?

1.沙盒结构

2.App Bundle 里面有什么

iOS 的签名机制大概是怎样的?

假设,我们有一个APP需要发布,为了防止中途篡改APP内容,保证APP的完整性,以及APP是由指定的私钥发的。首先,先将APP内容通过摘要算法,得到摘要,再用私钥对摘要进行加密得到密文,将源文本、密文、和私钥对应的公钥一并发布即可。那么如何验证呢?
验证方首先查看公钥是否是私钥方的,然后用公钥对密文进行解密得到摘要,将APP用同样的摘要算法得到摘要,两个摘要进行比对,如果相等那么一切正常。这个过程只要有一步出问题就视为无效。

iOS 7的多任务添加了哪两个新的 API? 各自的使用场景是什么?

UIScrollView 大概是如何实现的,它是如何捕捉、响应手势的?

在头文件定义一个contentSize属性

@interface MyScrollView : UIView
@property (nonatomic) CGSize contentSize;
@end
@implementation MyScrollView
- (instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self == nil) {
        return nil;
    }
    // 添加一个滑动手势
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGesture:)];
    [self addGestureRecognizer:pan];
    return self;
}

- (void)panGesture:(UIPanGestureRecognizer *)gestureRecognizer{
    // 改变bounds
    CGPoint translation = [gestureRecognizer translationInView:self];
    CGRect bounds = self.bounds;
    
    CGFloat newBoundsOriginX = bounds.origin.x - translation.x;
    CGFloat minBoundsOriginX = 0.0;
    CGFloat maxBoundsOriginX = self.contentSize.width - bounds.size.width;
    bounds.origin.x = fmax(minBoundsOriginX, fmin(newBoundsOriginX, maxBoundsOriginX));
    
    CGFloat newBoundsOriginY = bounds.origin.y - translation.y;
    CGFloat minBoundsOriginY = 0.0;
    CGFloat maxBoundsOriginY = self.contentSize.height - bounds.size.height;
    bounds.origin.y = fmax(minBoundsOriginY, fmin(newBoundsOriginY, maxBoundsOriginY));
    
    self.bounds = bounds;
    [gestureRecognizer setTranslation:CGPointZero inView:self];
}
// 让UIScrollView遵守UIGestureRecognizerDelegate协议,实现这个方法,在这里方法里对添加的手势进行处理就可以解决冲突
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

Objective-C 如何对已有的方法,添加自己的功能代码以实现类似记录日志这样的功能?

先在分类中添加一个方法,注意不能重写系统方法,会覆盖

+ (NSString *)myLog
{
    // 这里写打印行号,什么方法,哪个类调用等等
}

然后交换方法

// 加载分类到内存的时候调用
+ (void)load
{
    // 获取imageWithName方法地址
    Method description = class_getClassMethod(self, @selector(description));

    // 获取imageWithName方法地址
    Method myLog = class_getClassMethod(self, @selector(myLog));

    // 交换方法地址,相当于交换实现方式
    method_exchangeImplementations(description, myLog);
}

+load 和 +initialize 的区别是什么?

如何让 Category 支持属性?

头文件

@interface NSObject (test)
 
@property (nonatomic, copy) NSString *name;
 
@end

.m文件

@implementation NSObject (test)
// 定义关联的key
static const char *key = "name";
- (NSString *)name
{
    // 根据关联的key,获取关联的值。
    return objc_getAssociatedObject(self, key);
}
- (void)setName:(NSString *)name
{
    // 第一个参数:给哪个对象添加关联
    // 第二个参数:关联的key,通过这个key获取
    // 第三个参数:关联的value
    // 第四个参数:关联的策略
    objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

NSOperation 相比于 GCD 有哪些优势?

strong / weak / unsafe_unretained 的区别?

如何为 Class 定义一个对外只读对内可读写的属性?

在头文件中将属性定义为readonly,在.m文件中将属性重新定义为readwrite

Objective-C 中,meta-class 指的是什么?

meta-class 是 Class 对象的类,为这个Class类存储类方法,当一个类发送消息时,就去那个类对应的meta-class中查找那个消息,每个Class都有不同的meta-class,所有的meta-class都使用基类的meta-class(假如类继承NSObject,那么他所对应的meta-class也是NSObject)作为他们的类

UIView 和 CALayer 之间的关系?

+[UIView animateWithDuration:animations:completion:] 内部大概是如何实现的?

以上只是自己的理解,不一定正确,有对这个有研究的朋友请告知下

什么时候会发生「隐式动画」?

当改变CALayer的一个可做动画的属性,它并不能立刻在屏幕上体现出来.相反,它是从先前的值平滑过渡到新的值。这一切都是默认的行为,你不需要做额外的操作,这就是隐式动画

如何处理异步的网络请求?

异步请求:会单独开一个线程去处理网络请求,主线程依然处于可交互状态,程序运行流畅

    // POST请求
    NSString *urlString = @"www.baidu.com";
    // 创建url对象
    NSURL *url = [NSURL URLWithString:urlString];
    // 创建请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
    // 创建参数字符串对象
    NSString *parmStr = [NSString stringWithFormat:@"参数"];
    // 将字符串转换为NSData对象
    NSData *data = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:data];
    [request setHTTPMethod:@"POST"];
    // 创建异步连接
    [NSURLConnection connectionWithRequest:request delegate:self];

然后实现代理方法

// 服务器接收到请求时
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
}
// 当收到服务器返回的数据时触发, 返回的可能是资源片段
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
}
// 当服务器返回所有数据时触发, 数据返回完毕
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
}
// 请求数据失败时触发
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"%s", __FUNCTION__);
}

frame 和 bounds 的区别是什么?

如何把一张大图缩小为1/4大小的缩略图?

let data = UIImageJPEGRepresentation(image, 0.25)

还有一些题将写在第二篇文章里面,以上答案若有错误,请各位指出

上一篇下一篇

猜你喜欢

热点阅读