iOS Objective-C 面试整理

9 篇文章 0 订阅

面试的好处如同考试,获得肯定或者知道不足。对于ios,object编程的一些面试题做一些整理,如下:

1、notification是多线程的吗?
通知是监听者模式在ios编程里的应用,ios 的通知机制,包括通知发布,通知监听,通知移除。通知的发布看书简单的接口调用,其实是cocoa为用户做了监听者模式的封装,我们运行时没有发现其阻塞我们的操作,发布通知时后台另启线程,接收时回调到主线程进行处理。

2、在项目什么时候选择使用GCD,什么时候选择NSOperation?
项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSThreadOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。
项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会使代码更为易读,建议在简单项目中使用。

//创建一个队列
dispatch_queue_t queue = dispatch_queue_create("test", NULL)
//创建异步线程
dispatch_async(queue,^{
	//多线程
	//回到主线程执行
	dispatch_sync(dispatch_get_main_queue(),^{
		//回到主线程
	});
});

3、ARC环境下重写set方法

  • weak

    • (void)setMyObject:(id)newValue
      {
      if(_myObject != newValue) {
      _myObject = nil;
      _myObject = newValue;

      }

    }

  • assign

    -(void)setMyObject:(id)newValue
    {
    _myObject = newValue;
    }

  • retain (arc不准许调用retain)
    -(void)setMyObject:(id)newValue
    {
    if(_myObject != newValue){
    [_myObject release];
    _myObject = [newValue retain];
    }
    }

  • copy

    -(void)setMyObject:(id)newValue
    {
    if(_myObject != newValue)
    {
    [_myObject release];
    _myObject = [newValue copy];
    }
    }

4、 如何自定义tableview下拉、上拉刷新?
a给UIScorllerView添加类别,提供增加头部和尾部视图的方法
b定义头部、尾部视图,应该存在一些属性

#pragma mark - 父控件

@property (nonatomic, weak, readonly) UIScrollView *scrollView;

@property (nonatomic, assign, readonly) UIEdgeInsets scrollViewOriginalInset;

#pragma mark - 内部的控件

@property (nonatomic, weak, readonly) UILabel *statusLabel;

@property (nonatomic, weak, readonly) UIImageView *arrowImage;

@property (nonatomic, weak, readonly) UIActivityIndicatorView *activityView;

5 、iOS9.2.1安全登录如何判断设备唯一性?
iOS9.2.1以后一旦删除应用就会重新生成uuid,导致uuid不能作为唯一标示符。需加入SSKeyChain作处理

6聊聊你了解的runtime,runloop, release pool.

  • A 、runtime
    objc/runtime.h是系统提供的一些,用于修改运行时动态修改对象属性,和方法的一些C方法。后面作为专题来讲解。
    如"UINavigationBar+Awesome.h"提供一些运行时修改UINavigationBar没有提供属性修改方法:

    @interface UINavigationBar (Awesome)

    • (void)lt_setBackgroundColor:(UIColor *)backgroundColor;

    • (void)lt_setContentAlpha:(CGFloat)alpha;

    • (void)lt_setTranslationY:(CGFloat)translationY;

    • (void)lt_reset;

    @end

后面详细讲解。

  • B、runloop

run loops 是线程相关的基础框架的一部分。一个run loop是就是一个事件处理循环,不停调度工作,以及处理输入事件,是一个让线程能随时处理事件,单不退出的机制,相当于while(1)循环。
run loop同时负责autorelease pool的创建和释放。
线程和Runloop是一一对应的,其关系保存在一个全局的Dictionary里。线程生命周期存在五个状态:创建、就绪、运行、阻塞、死亡。线程刚创建是并没有Runloop,需要你主动获取。
NSRunloop可以保持一个线程一直为活动状态,并在线程结束时销毁掉。

  • C 、 release pool.

If you use Automatic Reference Counting (ARC), you cannot use autorelease pools directly. Instead, you use@autoreleasepool blocks. For example, in place of:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Code benefitting from a local autorelease pool.
[pool release];

you would write:

@autoreleasepool {
    // Code benefitting from a local autorelease pool.
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值