1、简述你对协议的理解?
protocol无论是在哪一个领域中都是一种规范和约束;在Object—C中协议主要用于在各个类之间进行回调,自定义的协议都要遵守NSObject协议,在协议方法中可以声明属性、方法,但是不能声明成员变量。协议有委托方和代理方;委托方是协议的制定者,需要声明协议的方法,实现协议的对象;而代理方是遵守协议的,是协议个遵守者,并要实现协议中的必要方法。例如当FirstView里面包含了SecondView,而SecondView需要修改FirstView里面的值就需要用到委托;
协议个步骤:
(1)SecondView中声明一个协议-协议方法;
(2)SecondView声明一个协议指针,在这里需要用weak,否则会造成强强引用,释放不掉;在ARC环境中也需要使用weak,否则会造成内存的泄露;
(3)SecondView遵循协议中的方法(需要判断代理是否存在);
(4)FirstView中需要遵守协议;
(5)FirstView中需要设置SecondView的代理;
(6)在FirstView中实现代理方法
2、如何理解ARC自动引用计数机制
自动引用计数(ARC:Automatic Reference Counting)是指内存管理中对引用采取自动计数技术。
ARC是通过发送消息实现的:
(1)当对象被创建(通过alloc、new或者copy等方法生成并持有)时,其引用计数初始值为retaincount=1;
(2)给对象发送retain消息(持有对象),引用计数retaincount+1;
(3)给对象发送release消息(释放对象),引用计数retaincount- 1;
(4)当对象引用计数为0时,给对象发送dealloc消息销毁对象(废弃对象);
此外,不要手动调用dealloc,因为我们不知道对象何时何地还会被使用,所以还是需要按部就班的依赖引用计数完成内存管理;
3、如何理解 retain/copy/assign/release/autor release/dealloc关键字?
(1)assign:直接赋值,可能引起多个对象同时指向同一块内存,当一个对象不再使用这块内存的时候,无法是否,否则其余的对象就没办法使用这块内存,会造成程序的崩溃,当数据为int,float等原生类型时可以使用assign;
(2)retain是使用了引用计数,当给一块内存使用引用计数,当内存被分配并赋值给对象的时候,引用计数+1,以此类推,当一个对象不再使用这块内幕才能的时候,只需要让引用计数-1即可,直到引用计数为0时,表示该内存不再被任何指针使用,这块内存被释放;
(3)copy是在不希望对个对象使用同一块内存的时候使用,主要用于NS听对象;
(4)release:手动释放内存,调用一次,引用计数-1,直到引用计数为0;
(5)dealloc:当引用计数为0的时候,系统会调用dealloc,销毁对象,释放内存;
(6)autorelease原理:
a.先建立一个autorelease pool;
b.对象从这个autorelease pool里面生成;
c.对象生成之后调用autorelease函数,这个函数的作用仅仅是在autorelease pool中做标记,让pool记得将来release这个对象;
d.程序结束时,pool本身也需要release,此时pool会把每一个标记为autorelease的对象release一次,如果某个对象此时的引用计数大于1,这个对象那个还是没有被销毁。
4、self.name和_name的区别
(1)通过self.name方法引用:包含了setter和getter方法;而_name是获取自己的实例变量,不包含setter和getter方法。
(2)self.name是对属性的访问,而_name是对局部变量的访问。所用被声明为属性的成员,在iOS5之前都需要使用编译指令@synthesize来告诉编译器帮助生成属相的getter和setter方法,之后这个指令可以不用人为的指定,默认情况下编译器会帮助我们生成。编译器在生成getter和setter方法是室友优先级,首先查找当前的勒种用户是否定义属性的getter方法和setter方法,如果有,编译器会跳过,不会在生成,使用用户定义的方法。也就是在使用self.name时时调用一个getter方法,会引起引用计数+1,而_name不会使引用计数+1;
所以使用self.name是更好的选择,因为这样可以兼容懒加载,同时也避免了使用下滑线的时候忽略了self这个指针,_name容易在Block中造成循环引用,同时_name是获取不到弗雷的属性,因为它只是对局部变量的访问。
总结:self.name方法实际上是用了getter和setter方法间接调用,_name方法是直接对变量的操作。
5、继承与类别的联系与区别
联系:可以给一个类扩展新的方法,或修改已用的方法;
区别:
(1)继承,这个是面向对象语言都有的一个特性,子类会继承弗雷德方法和属性;对于以下情况必须使用继承:
a.新扩展的方法与原方法同名,但还需要使用父类的实现,因为使用类别,会覆盖原来的方法实现,无法访问到原来的方法。
b.扩展类的属性,类别无法做到;
(2)类别Category。这是Objective-C语言的一个特性,可以在不改变类名和原来类的实现的前提下,实现对类的方法扩展;以下两种方式最后使用类别:
a.针对系统提供的一些类,例如:NSString,NSArray,NSNumber等,系统本身不提倡使用继承去扩展方法,因为这些类内部实现对继承有所限制,所以最后使用过类别来进行方法扩展。
b.类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,对于大型而复杂的类,这有助于提高可维护性,并简单化源文件的管理。
6、Strong与Weak的区别
strong和weak都是指针属性。
strong便是保存这个指针对象的内存直到结束使用,也就是说,强力的指向了一个区域,直到执行nil或者自己也不再内存上面了。
weak表示如果没人在用这个指针了,那就设为nil,只用还有对象指向它,那么久保留它,也就是说不再指向它了也没用关系。事实上,weak还表示如果没有对象指向它,他就会被清除内存,同时就被指向nil,因为不能读取不存在的东西。
如果把strong和weak与气球联想起来或许更容易理解。只用当没用人牵住气球的绳子的时候气球才会飞走(dealloc),牵住气球的人数就是retain count,很多人可以通过绳子牵住同一个气球,你可以用strong 或者是weak来对相关的对象进行get/set properties和call methods操作。强(strong)就像牵住气球的绳子,气球就不会飞走;弱(weak)就像是盯着气球看,你能看到它,access properties,call methods,但是气球的绳子不再你手上,如果所有牵住气球的人呢都松手,气球就飞走了,然后你也无法对它进行操作。
7、私有API与公开API的区别
iPhone中的API除了API:Publish API外(或者叫文档中记录的API:Documented API),还有两类API:私有API(Private API) 和未公开的API(UnPublished API,或者叫文档中未记录的API(UnDocumented API))。其中私有API是只放在PrivateFrameworks框架中的API,未公开的API是指虽然放在Frameworks框架中,但是没有在苹果的官方文档中有使用说明、代码介绍等记录的API。后两种API是有区别的,按苹果官方的说说法,未公开的API是是不够成熟,可能还会变动的API,等完全成型后会变成公开的API,但是目前不对其提供承诺,就是系统版本升级后可能会失效。而私有API是苹果名曲不能使用的API。虽然两者有区别,但是在具体使用方法上是类似的。
9 、请简述深拷贝和浅拷贝的区别
(1)浅拷贝只复制对象的本身,对象里的属性、包含的对象不做复制,源对象和副本指向的是同一个对象,对象的引用计数器+1,其实相当于做了一次retain操作;
(2)深拷贝则复制对象本身,对象的属性也会复制一份,源对象和副本指向的是不用的两个对象,源对象引用计数器不变,副本计数器设置为1,只有不可变对象创建不可变副本才是浅拷贝,其他都是深拷贝。
10、系统中有哪些对象是单例
(1)UIApplication(应用程序实例)
(2)NSNotificationCenter(消息中心):
(3)NSFileManager(文件管理):
(4)NSUserDefaults(应用程序设置):
(5)NSURLCache(请求缓存):
(6)NSHTTPCookieStorage(应用程序cookies池)
11、请简述你对MVC设计模式的理解
MVC是一种结构设计,M表示数据模型Model,V表示视图View,C表示控制器Controller。
(1)数据模型:负责存储、定义、操作数据;
(2)视图:用来展示数据给用户,和用户进行操作交互;
(3)控制器:是M和V的协调者,控制器获取收,将数据交给视图去展示。
Controller可以直接与Model和View进行通信,而View不能喝Controller直接通信。View与Controller通信需要利用代理协议的方式,当有数据的更新时,Model也要与Controller进行通信,这个时候就用Notification和KVO,这个方式就像一个广播一样,Model发信号,Controller设置监听器接收信号,当有数据要更新时,就发信号给Controller。Model和View不能直接进行通信,因为这样就违背了MVC的设计思想。
13、Apple设备尺寸和变成尺寸
设备 系统 分辨率 屏幕尺寸 倍数
-iPhone
-iPhone2Gs iOS1 320*480 3.5英寸 1x
-iPhone3G iOS2 320*480 3.5英寸 1x
-iPhone3Gs iOS3 320*480 3.5英寸 1x
-iPhone4 iOS4 320*480 3.5英寸 2x
-iPhone4s iOS5 320*480 3.5英寸 2x
-iPhone5 iOS6 320*568 4.0英寸 2x
-iPhone5s/c iOS7 320*568 4.0英寸 2x
-iPhone6 iOS8 375*667 4.7英寸 2x
-iPhone6plus iOS8 414*736 5.5英寸 3x
-iPod Touch
-iPod Touch1G iOS1 320*480 3.5英寸 1x
-iPod Touch2G iOS3 320*480 3.5英寸 1x
-iPod Touch3G iOS3 320*480 3.5英寸 1x
-iPod Touch4G iOS4 320*480 3.5英寸 2x
-iPod Touch5G iOS6 320*568 4.0英寸 2x
-iPad
-ipad iOS3 1024*768 9.7英寸 1x
-ipad2 iOS4 1024*768 9.7英寸 1x
-ipad3(New iPad)iOS5 1024*768 9.7英寸 2x
-ipad4 iOS6 1024*768 9.7英寸 2x
-ipad Air iOS7 1024*768 9.7英寸 2x
-ipad Air iOS8 1024*768 9.7英寸 2x
-iPad mini
-iPad mini iOS6 1024*768 7.9英寸 1x
-iPad mini2 iOS7 1024*768 7.9英寸 2x
-iPad mini3 iOS8 1024*768 7.9英寸 2x