iOS常见笔试题目

1.objective-c中的数字对象都有哪些,简述它们与基本数据类型的区别是什么。
oc中用NSNumber类来包装基本数据类型,基本类型只是一个值,没有任何行为。

2.怎样自动生成属性的获取方法和设置方法。
将属性设置成@property,Xcode会根据属性中的特性(retain,copy,assign)自动生成不同的getter和setter方法,这个具体的内部实现是不可见的。

// retain 性质的setter内部实现
-(void)setName:(NSString *)name{
    if (_name != name) {
        [_name release];        // 旧值release
        _name = [name retain];  // 新值retain
    }
}
// copy 性质的setter内部实现
-(void)setName:(NSString *)name{
    if (_name != name) {
        [_name release];
        _name = [name copy];
    }
}
// getter 的系统内部实现
-(NSString *)getName{
    return [[_name retain] autorelease];
}

3.oc的类可以多继承么?可以用什么方式实现多继承?
oc只支持单继承,可以通过类别和协议的方式来实现多继承。

4.id声明的对象有什么特征
id类型的变量可以存放任何数据类型的对象。在内部处理上,这种类型被定义为指向对象的指针,实际上是一个指向这种对象的实例变量的指针。

5.instanceType

6.category,protocol,delegate,extension,
category:类别是一种为现有的类添加新方法的方式,可以为任何类添加category,哪怕是那些没有源码的类。
注意: 无法向category中添加新的实例变量,运行时报错。可以用rumtime解决。当category中方法名与现有类名重名时,类别具有更高的优先级,将取代现有的方法。
NSString+NumberConvience.h

protocol:协议是一个方法签名列表,其中定义了若干个方法,@required这是委托对象必须实现的,@optional这是可选的。

`@protocol xxxDelegate`
`method1,method2`
`@property(nonatomic,assign)id delegate`

delegate: 委托是一种对象,是实现协议的对象。比如类B设置了类A的delegate对象为其自身,那么类B就要实现类A中制定的某些方法。协议和代理在iOS中是配合使用的。

extension: 扩展可以理解成是没有名字的分类,扩展可以添加属性,成员变量,方法名称。类扩展写在.m中,这些内容就都是私有的了,只有本类才可见。

7.ios如何做数据持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库么?

8.UIView和CALayer有什么区别?

9.如何理解单利
所谓单利应该是“创建一次,永久有效”,单利应该只用来保存全局的状态,并且不能和任何作用域绑定,如果这个作用域的生命周期比一个完整的应用的生命周期短,那么这种状态的变量就不能用单利来管理。http://objccn.io/issue-13-2/

+(instancetype)sharedInstance{
    static dispatch_once_t once;
    static id sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

10.深拷贝与浅拷贝
深拷贝创建的对象自主分配内存空间,与源对象互不影响,各自独立。浅拷贝产生的对象与源对象共享同一个内存地址,当指向这片内存的地址被销毁时,指向这块内存的指针要重新定义,否则会产生野指针。http://www.jianshu.com/p/cd623207c5ac

11.多线程,NSOperation,GCD

12.__block,__weak

13.线程与进程的区别


iOS常见笔试题目_第1张图片
process_thread_task.png

14.简述UIButton的继承关系
UIButton的父类是UIControl,UIControl的父类是UIView,UIView的父类是UIResponder

15.简述weak,strong,assign,copy,retain关键字
1.在ARC中,使用weak来避免循环引用,比如delegate的属性(也可以用assign修饰),weak修饰符必须用于oc对象。
2.strong
3.在非ARC中,assign是property的默认属性,无论这个属性是何种类型的数据。但是assign常用于修饰简单的数据类型,当然它修饰的property不会持有一个对象。
4.copy修饰的变量必须是oc类型的数据,copy将会产生一个新的对象,这个新对象的引用计数+1,如果一个对象被copy修饰,那么赋值到这个属性时,是对原来对象的一个拷贝,且是复制一个不可变的对象。比如说一个可变的数组用copy修饰,当再对这个数组进行添加,删除或者修改时就会造成崩溃。用copy修饰后它已经是一个不可变的对象了。
5.retain修饰的属性也是oc类型的数据,用retain修饰的属性,代表这个属性持有它所指的对象。每retain一次引用计数+1,

6.小结一下:
对于NSString,NSDictionary,NSArray等这类不可变的对象用copy修饰;
delegate为避免强引用,使用weak或者assign修饰;
如NSMutableString,NSMutableArray,NSMutableDictionary等可变对象用copy修饰;

http://rypress.com/tutorials/objective-c/properties

16.ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些
1.对应基本数据类型默认关键字是 atomic,readwrite,assign
2.对于普通的 Objective-C 对象 atomic,readwrite,strong

17.说说#import,#include和@class
1、import会包含这个类的所有信息,使用这个会把引用类的头文件过一遍,即把.h文件里的变量和方法包含进来一次,且仅一次。
2、包含c/c++头文件时用#include,#include比起#import有可能会引起交叉编译。
3、@class来声明这个名词是类的名称,不需要知道其内部的变量和方法,使用这种编译的效率更高。

18.iOS的屏幕适配
1.iPhone4s屏幕大小坐标不变,使用绝对定位,使用.png和@2x.png,系统自动选择使用哪张图片。
2.iPhone5/5c/5s,屏幕多出88个点,使用AutoLayout技术解决适配问题,使用[email protected]
3.iphone6/6s,使用AutoLayout适配,[email protected] [email protected]

  1. NSNull,nil,null

|标志 | 值| 含义| 补充|
|--------------|----------|-------|
|NULL | (void *)0 | C指针的字面零值| NULL作为指针|
|nil |(id)0 |Objective-C对象的字面零值| 指向一个不存在对象的指针|
|Nil |(Class)0| Objective-C类的字面零值| 指向零的类指针|
|NSNull |[NSNull null] |用来表示零值的单独的对象| 对象|

20.深度拷贝与浅拷贝
深拷贝虽然新对象与源对象的内容相同,但是两者使用的是不同的内存区域,相互独立受影响。
浅拷贝产生的新对象指向源对象的地址,当源对象被销毁后后新对象会成为野指针。

21.copy和mutableCopy的区别

22.程序在内存中的分配情况

23.static关键字
在变量前面加上static关键字,只在程序启动的时候初始化它的值。

static int sCount = 100;
-(void)testStatic{
    sCount+=5;
    NSLog(@"sCount = %d",sCount);// 结果:105
    for (int i=0; i<5; i++) {
        sCount++;
    }
    NSLog(@"sCount = %d",sCount);// 结果:110
}

24.如何优化TableView
1.在
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath中做数据绑定
2.可以使用一个类方法来动态的计算cell的高度,而不是在初始化cell实例并绑定数据后去获得它的高度。
3.或者使用AutoLayout将rowHeight变量设置为UITableViewAutomaticDimension来设置cell的动态高度。(这个要求iOS8及更高版本)。如果你cell的子视图很多,这个方法也不见得好使。子视图越多,AutoLayout的效率就越低。
4.减少无用的混合区域,不要使用透明背景。
5.平衡CPU和GPU的负载,可以将某些渲染工作用CPU来处理。
6.对所有像素相关的数据做四舍五入处理,包括坐标,UIView的宽高。
7.异步UI(将一些耗时与UI有关的工作放到另一个线程中处理)。

总之:尽快的返回cell,tableview就会越流畅。

Instruments
color blended layers
color misaligned images
color off-screen rendered

25.const关键字
const意味着只读,一旦变量被const修饰,那么就不能再修改它了,否则编译时直接报错。

26.对于枚举常用如下风格的

typedef NS_OPTIONS(<#_type#>, <#_name#>) <#new#>;
typedef NS_ENUM(<#...#>) <#new#>;

27.对于一些变量应尽量使用Foundation数据类型的,不要直接用基本的数据类型,如int,float,long等。

28.简单描述下ios的网络请求
GET请求的参数会作为链接的一部分暴露出来,服务器地址和参数之间用"?"分隔。GET请求一般多用于向服务端拉取数据。
POST请求的参数跟服务器ip分开,请求接口中只有服务器地址,参数作为请求的一部分提交给后台。POST请求多用于像服务端提交数据。
网络请求有两种方式
1.同步GET
2.同步POST
3.异步GET
4.异步POST

29.有关RunTime
runtime是一个有c和汇编语言构成的开源库,它所做的事情是加载类信息,进行方法的分发和转发,Object-C作为一门动态语言正是得益于runtime,函数的编译和链接可以推迟到运行时进行,给一个对象发送的消息不会立即执行,而是在运行的时候再去找它对应的实现。runtime的好处在于增强了代码的灵活性,
1.动态类型id,任何数据对象类都可以用id指定
2.动态绑定,实例所属类确定后,将某些属性和相应的方法绑定到实例上。
3.动态加载,比如加载@2x的图片

使用objc_msgSend函数,会执行以下步骤
通过对象(类)的isa指针去找到他的class
在class的method list 找到该消息的实现
如果class中没有改消息的实现,就继续到它的super_class中去找
一旦找到这个这个消息的实现,那么就去执行他的IMP
这样的话每发送一个消息就要方法列表objc_method_list进行一次遍历,为了提高效率,使用了objc_cache对经常调用的函数进行缓存,再次调用时就先到objc_cache中去查找函数实现。

30.RunLoop

31.内存管理
1、为什么要使用内存管理?
用于对象间传递和共享数据。

2、不要向一个已经释放的对象发送消息。
3、循环引用,多个对象造成引用环。弱引用虽然持有对象,但是并不增加引用计数,以此来避免循环引用的问题。例如delegate用weak或者assign修饰。

1、ARC是编译时的特性,而非运行时,更不是GCD
2、对于某些特定文件
开启ARC:-fobjc-arc
关闭ARC:-fno-objc-arc

28.loadView
1-> 访问UIViewController的view时,并且view为nil时会调用此方法(self.view,controller.view)。
2-> 调用[super loadView]时候,会先查找该UIViewController相关联的xib(若无关联则加载与该UIViewController同名的xib),通过xib来加载view。若未找到任何相关的xib,就会创建一个空白的view。然后付给UIViewController的view。
3-> loadView方法的具体使用情况是,当xib不听使唤我们需要手写代码的时候,重写loadView即可。
我们想用代码实现某些功能的时候

viewDidUnload
viewDidUnload已经被废弃了,当内存紧张的时候view被释放,viewDidUnload被调用,释放与界面相关的元素以及实例都被赋值为nil。与dealloac的关系是,dealloac会在UIViewController被释放的时候调用。

顺序:loadViewviewDidLoadviewDidUnload

29.http状态码

HTTP状态码的五大类
100-199 用于指定客户端应相应的某些动作。
200-299 用于表示请求成功。
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
400-499 用于指出客户端的错误。
500-599 用于支持服务器错误
成功2××
 成功处理了请求的状态码。
200
服务器已成功处理了请求并提供了请求的网页。
204
 服务器成功处理了请求,但没有返回任何内容。


重定向3××
 每次请求中使用重定向不要超过 5 次。
301
 请求的网页已永久移动到新位置。当URLs发生变化时,使用301代码。搜索引擎索引中保存URL。
302
 请求的网页临时移动到新位置。搜索引擎索引中保存原来的URL。
304
如果网页自请求者上次请求后没有更新,则用304代码告诉搜索引擎机器人,可节省带宽和开销。


客户端错误4×× 表示请求可能出错,妨碍了服务器的处理。
400
 服务器不理解请求的语法。
403
服务器拒绝请求。
404
 服务器找不到请求的网页。服务器上不存在的网页经常会返回此代码。
410
 请求的资源永久删除后,服务器返回此响应。该代码与 404(未找到)代码相似,但在资源以前存在而现在不存在的情况下,有时用来替代404代码。如果资源已永久删除,应当使用 301 指定资源的新位置。


服务器错误5××
 表示服务器在处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。
500
 服务器遇到错误,无法完成请求。
503
 服务器目前无法使用(由于超载或停机维护)。

更多内容:
https://github.com/ChenYilong/iOSInterviewQuestions/blob/master/01%E3%80%8A%E6%8B%9B%E8%81%98%E4%B8%80%E4%B8%AA%E9%9D%A0%E8%B0%B1%E7%9A%84iOS%E3%80%8B%E9%9D%A2%E8%AF%95%E9%A2%98%E5%8F%82%E8%80%83%E7%AD%94%E6%A1%88/%E3%80%8A%E6%8B%9B%E8%81%98%E4%B8%80%E4%B8%AA%E9%9D%A0%E8%B0%B1%E7%9A%84iOS%E3%80%8B%E9%9D%A2%E8%AF%95%E9%A2%98%E5%8F%82%E8%80%83%E7%AD%94%E6%A1%88%EF%BC%88%E4%B8%8A%EF%BC%89.md

你可能感兴趣的:(iOS常见笔试题目)