iOS 面试题总结 (一)持续更新

1.简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak属性的作用?

答:OC中内存管理机制应该就是引用计数的增减,retainCount为0时释放该内存。

         retain对应的是release,引用计数增加就要减少,内存的释放用release。
         alloc对应的是dealloc,创建就要销毁,内存的销毁用dealloc。

          readwrite此标记说明属性会被当成读写的,这也是默认属性。
         readonly此标记说明属性只可以读,也就是不能设置,可以获取。
         assign不会使引用计数加1,也就是直接赋值。
         retain会使引用计数加1。
         copy建立一个索引计数为1的对象,在赋值时使用传入值的一份拷贝。
          nonatomic:非原子性访问,多线程并发访问会提高性能。
         atomic:原子性访问。
         strong:打开ARC时才会使用,相当于retain。
         weak:打开ARC时才会使用,相当于assign,可以把对应的指针变量置为nil。

 
readwtite : 可读写(设置器和访问器)   readonly : 只读(访问器)     assign : 只做赋值  
retain,copy : 赋值并引用计数加1  copy : 拷贝并引用计数加1 nonatomic : 非原子性  anotamic : 原子性(保证多线程安全)   
strong : 打开ARC时才会使用,相当于retain   weak : 打开ARC时才会使用,相当于assign, 可以把对应的指针变量置为nil

 copy : 适用于接受了nscopy 协议的对象类型 assign : 适用于一般类型 retain : 适用于一般对象类型

2 .类变量的@protected,@private,@public,@package声明各有什么含义?

答案:

@protected —Methods defined in the class and any subclasses can directly access the instance variables that follow.This is the default case.

该类和所有的子类中的方法可以直接访问这样的变量,这是默认的

@private —Methods defined in the class can directly access the instance variables that follow, but subclasses cannot.

该类中的方法可以访问这样的变量,子类不可以。

@public —Methods defined in the class and any other classes or modules can di- rectly access the instance variables that follow.

除了自己和子类中的方法外,也可以被其他类或者其他模块中的方法所访问。开放性最大。

@package —For 64-bit images, the instance variable can be accessed anywhere within the image that implements the class.

对于64位图像,这样的成员变量可以在实现这个类的图像中随意访问。


3 线程是什么?进程是什么?二者有什么区别和联系?  
 线程,有时称为轻量级进程,是被系统独立调度和CPU的基本运行单位。        
 进程是操作系统中可  以并行工作的基本单位。 
 一个应用程序里至少有一个进程,一个进程里至少有一个线程

线程与进程的区别可以归纳为以下4点:
  1)地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
  2)通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
  3)调度和切换:线程上下文切换比进程上下文切换要快得多。
  4)在多线程OS中,进程不是一个可执行的实体。


4 谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?      
  在一个进程中有多个线程,每个线程有自己单独的任务 
  优点效率快   缺点不安全,耗费资源      
 有三种 
  第一种,使用@synchronized(self) 
  第二种,使用GCD 
  第三种,使用NSOperationQueue

第一种,使用@synchronized(self)

 static LocationController *sharedInstance;

+ (LocationController *)sharedInstance {
     @synchronized(self) {
     if (!sharedInstance)
     sharedInstance=[[LocationController alloc] init];
     }
     return sharedInstance;
}

@synchronized
作用:创建了一个互斥锁,它的作用和其他语言中的互斥锁作用一样
解释:这个是Objective-C中的一个锁定令牌,方便一个对象在同一时间内被其他线程访问,起到了线程保护的作用
使用范围:一般在单例模式或者操作类的static变量的时候使用,即共用的变量的时候
外延:这个令牌隐式的包含了异常处理,如果你不想使用的话,就使用锁吧


第二种,使用GCD

static LocationController *sharedInstance;

+ (LocationController *)sharedInstance {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (!sharedInstance)
            sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
   
}

通过Grand Central Dispatch系统,无论你何时需要在后台运行某个事务,你仅仅需要调用一下dispatch_async,然后传需要执行的事务代码给它即可。

其实,Grand Central Dispatch隐藏了很多后台处理细节如锁和同步机制,并且它会根据情况创建一个新线程或使用已有的线程。
当你调用dispatch_async,你通过一个dispatch队列,在这个队列上存有很多block,先进先出,依次执行。
这个队列可以使用dispatch_create自己创建,也可以调用主线程队列dispatch_get_main_queue。这里建立的队列名称是onceToken。


第三种,使用NSOperationQueue

IOS2.0之后,ios又对Grand Central Dispatch做了封装,产生了一个新的类NSOperationQueue。
因此,使用NSOperationQueue就是使用Grand Central Dispatch,NSOperationQueue仅仅是建立在Grand Central Dispatch上一些简单的API。

static LocationController *sharedInstance;

+ (LocationController *)sharedInstance {
    NSOperationQueue *onceToken=[[NSOperationQueue alloc] init];
    [onceToken addOperationWithBlock:^(){
      if (!sharedInstance)
            sharedInstance = [[self alloc] init];
    });
    return sharedInstance; 
    }];
    }

5线程同步和异步的区别?IOS中如何实现多线程的同步?

线程同步与异步区别

线程同步是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低    线程异步:访问资源时在空闲等待时同时访问其他资源,实现多线程机制

异步处理就是,你现在问我问题,我可以不回答你,等我用时间了再处理你这个问题.同步不就反之了,同步信息被立即处理 -- 直到信息处理完成才返回消息句柄;异步信息收到后将在后台处理一段时间 -- 而早在信息处理结束前就返回消息句柄


多线程的同步
1  原子操作 - OSAtomic系列函数
不同线程如果通过原子操作函数对同一变量进行操作,可以保证一个线程的操作不会影响到其他线程内对此变量的操作
2  锁 - NSLock系列对象
同一个NSLock对象成功调用lock函数后,在其显示unLock之前任何进程都不能对此对象加锁,以达到互斥访问的目的
NSLock类型对象都是可以具名的,就是说,这些对象可以用于不同进程内部的线程同步
3  事件 - NSCondition
NSCondition类型提供了wait与signal函数,分别代表了等待事件的操作以及触发事件的操作。当然还有类似于NSLock中的lockBeforeDate功能相似的 waitUntilDate函数,简单的说就是提供了一个带超时的wait函数
NSCondition也是具名的 在其使用过程中timeToWork变量必不可少

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值