zoukankan      html  css  js  c++  java
  • 简单的总结一下iOS面试中会遇到的问题

    1.线程是什么?进程是什么?二者有什么区别和联系?  
    一个程序至少有一个进程,一个进程至少有一个线程: 
    进程:一个程序的一次运行,在执行过程中拥有独立的内存单元,而多个线程共享一块内存 
    线程:线程是指进程内的一个执行单元。 
    联系:线程是进程的基本组成单位 
    区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
 (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
 (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
 (4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

    2.简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?  
    管理机制:使用了一种叫做引用计数的机制来管理内存中的对象。OC中每个对象都对应着他们自己的引用计数,引用计数可以理解为一个整数计数器,当使用alloc方法创建对象的时候,持有计数会自动设置为1。当你向一个对象发送retain消息 时,持有计数数值会增加1。相反,当你像一个对象发送release消息时,持有计数数值会减小1。当对象的持有计数变为0的时候,对象会释放自己所占用的内存。 
    retain(引用计数加1)->release(引用计数减1) 
    alloc(申请内存空间)->dealloc(释放内存空间) 
    readwrite: 表示既有getter,也有setter (默认) 
    readonly: 表示只有getter,没有setter 
    nonatomic:不考虑线程安全 
    atomic:线程操作安全 (默认) 
    线程安全情况下的setter和getter: 
    - (NSString*) value { 
    @synchronized(self) { 
    return [[_value retain] autorelease]; 
    }}  
    (void) setValue:(NSString*)aValue { 
    @synchronized(self) { 
    [aValue retain]; 
    [_value release]; 
    _value = aValue; 
    } } 
    retain: release旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 
    assign: 简单赋值,不更改索引计数 (默认) 
    copy: 其实是建立了一个相同的对象,地址不同(retain:指针拷贝 copy:内容拷贝) 
    strong:(ARC下的)和(MRC)retain一样 (默认) 
    weak:(ARC下的)和(MRC)assign一样, weak当指向的内存释放掉后自动nil化,防止野指针 
    unsafe_unretained 声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。
autoreleasing 用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。

    3.类变量的@protected ,@private,@public,@package,声明各有什么含义? 
    @private:作用范围只能在自身类 
    @protected:作用范围在自身类和继承自己的子类 (默认) 
    @public:作用范围最大,可以在任何地方被访问。 
    @package:这个类型最常用于框架类的实例变量,同一包内能用,跨包就不能访问

    4.谈谈你对多线程开发的理解?ios中有几种实现多线程的方法? 
    好处: 
    1.使用线程可以把占据时间长的程序中的任务放到后台去处理 
    2.用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 
    3.程序的运行速度可能加快 
    4·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。 
    缺点: 
    1.如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。 
    2.更多的线程需要更多的内存空间。 
    3.线程的中止需要考虑其对程序运行的影响。 
    4.通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。 
    实现多线程的方法: 
    NSObject类方法 
    NSThread 
    NSOperation 
    GCD

    5.线程同步和异步的区别?IOS中如何实现多线程的同步? 
    异步:举个简单的例子 就是游戏,游戏会有图像和背景音乐 
    同步:是指一个线程要等待上一个线程执行完之后才开始执行当前的线程,上厕所 
    NSOperationQueue:maxcurrentcount 
    NSConditionLock 
    GCD->http://blog.csdn.net/onlyou930/article/details/8225906 

    6.获取一台设备唯一标识的方法有哪些? 
    http://www.cnblogs.com/max5945/archive/2013/06/24/3152292.html

    (1)UDID 
    (2)UUID 
    (3)MAC Address 
    (4)OPEN UDID 
    (5)广告标识符 
    (6)Vindor标示符 
    *ios7以后使用keychain 

    7.iOS类是否可以多继承?如果没有,那可以用其他方法实现吗?简述实现过程。 
    不可以多继承 用protocol实现

    8.堆和栈的区别? 
    堆需要用户手动释放内存,而栈则是编译器自动释放内存 
    问题扩展:要知道OC中NSString的内存存储方式

    9.这段代码有什么问题吗:

    @implementation Person 
    - (void)setAge:(int)newAge { 
    self.age = newAge; 

    @end

    正确写法 

    if(_age){ 
    [_age release]; 

    _age = [newAge retain];


    死循环(扩展:知道如何正确写setter和getter方法)

    10.iOS本地数据存储都有哪几种方式? 
    NSKeyedArchiver 
    NSUserDefaults 
    Write写入方式 
    SQLite3 
    http://blog.csdn.net/tianyitianyi1/article/details/7713103

    (问题扩展:什么情况下使用什么样的数据存储) 
    1.NSKeyedArchiver:采用归档的形式来保存数据,数据对象需要遵守NSCoding协议,对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。缺点:只能一次性归档保存以及一次性解压。所以只能针对小量数据,对数据操作比较笨拙,如果想改动数据的某一小部分,需要解压或归档整个数据。 
    2.NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。缺点:如果要存储其他类型,需要转换为前面的类型,才能用NSUserDefaults存储。 
    3.Write写入方式:永久保存在磁盘中。第一步:获得文件即将保存的路径:第二步:生成在该路径下的文件:第三步:往文件中写入数据:最后:从文件中读出数据: 
    4. SQLite:采用SQLite数据库来存储数据。SQLite作为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些。

    11.简述你对UIView、UIWindow和CALayer的理解

    http://blog.csdn.net/kuqideyupian/article/details/7731942 
    http://o0o0o0o.iteye.com/blog/1728599

    12.写一个完整的代理,包括声明,实现

    注意手写的准确性

    13.分析json、xml的区别?json、xml解析方式的底层是如何处理的?

    http://www.open-open.com/bbs/view/1324367918671 
    http://hi.baidu.com/fevelen/item/a25253ab76f766756cd455b6

    14.ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?默认的操作是什么?

    http://blog.sina.com.cn/s/blog_68661bd80101nn6p.html

    15.面向对象的三大特征,并作简单的介绍

    封装、继承、多态 
    多态:父类指针指向子类对象。两种表现形式:重写(父子类之间)和重载(本类中) 
    OC的多态体现是:重写,没有重载这种表现形式

    举例说明:

    @interface Parent : NSObject //父类 
    - (void)simpleCall; 
    @end  
    @interface Child_A : Parent //子类 Child_A 
    @end  
    @implementation Child_A 
    - (void)simpleCall 

    NSLog(@”我是Child_A的simpleCall方法”); 

    @end 
    @interface Child_B : Parent //子类Child_B 
    @end 
    - (void)simpleCall 

    NSLog(@”我是Child_的simpleCall方法”); 

    @end

    然后,我们就可以看到多态所展示的特性了: 
    Parent * pa=[[Child_A alloc] init];// 父类指针指向子类Child_A对象 
    Parent * pb=[[Child_B alloc] init]; //父类指针指向子类Child_B对象 
    [pa simpleCall];// 显然是调用Child_A的方法 
    [pb simpleCall];// 显然是调用Child_B的方法

    在OC中常看见的多态体现: 
    - (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    static NSString *CellWithIdentifier = @”Cell”; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellWithIdentifier]; 
    return cell; 
    }

    (UITableViewCell *)指向cell子类对象

    16.如监测系统键盘的弹出

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector( ) name:UIKeyboardWillShowNotification object:nil]; 
    扩展:ios 弹出键盘挡住UITextView的解决方式

    17.举出5个以上你所熟悉的ios sdk库有哪些和第三方库有哪些?

    AFWorking/WebKit/SQLite/Core Data/Address Book

    18.如何将产品进行多语言发布?

    http://fengmm521.blog.163.com/blog/static/25091358201291645852889/

    19.如何将敏感字变成**

    search = @”某某某”; 
    replace = @“*”; 
    range = [mstr rangeOfString:search]; 
    [mstr replaceCharactersInRange:range withString:replace]; 
    NSLog(@”%@”,mstr);

    20.objc中的减号与加号代表什么?

    类方法 
    21.单例目的是什么,并写出一个?

    避免重复创建 节省内存空间 
    static Model * model; 
    +(id)singleton{ 
    if(!model){ 
    @synchronized(self){ 
    model = [[Model alloc]init]; 
    }} 
    return model; 
    }

  • 相关阅读:
    20155313 杨瀚 《网络对抗技术》实验九 Web安全基础
    20155313 杨瀚 《网络对抗技术》实验八 Web基础
    20155313 杨瀚 《网络对抗技术》实验七 网络欺诈防范
    20155313 杨瀚 《网络对抗技术》实验六 信息搜集与漏洞扫描
    20155313 杨瀚 《网络对抗技术》实验五 MSF基础应用
    20155313 杨瀚 《网络对抗技术》实验四 恶意代码分析
    20155313 杨瀚 《网络对抗技术》实验三 免杀原理与实践
    20155313 杨瀚 《网络对抗技术》实验二 后门原理与实践
    20155313 杨瀚 《网络对抗技术》实验一 PC平台逆向破解(5)M
    20155313 2017-2018-1 《信息安全系统设计基础》课程总结
  • 原文地址:https://www.cnblogs.com/ywr-zf/p/5917772.html
Copyright © 2011-2022 走看看