iOS面试题总结

1.为何说Objective-C是相同派别动态的语言?

1.object-c类底类型和数据变量的门类且是以运行是确定的,而非是在编译时规定。例如:多态特性,我们得下父类对象来乘为子类对象,并且可就此来调用子类的方式。运行时(runtime)特性,我们可以动态的丰富方法,或者替换方法。

2.讲一下MVC和MVVM,MVP?

MVC:简单来说即使是,逻辑、试图、数据进行分,实现解耦。
MVVM:是Model-View-ViewMode模式之简称。由视图(View)、视图模型(ViewModel)、模型(Model)三片组成.比MVC更加自由控制器臃肿,将一部分逻辑(耗时,公共艺术,网络要等)和数码的拍卖等操作由控制器里面搬运到ViewModel
MVVM的特点:

  1. 亚耦合。View可以单独为Model变化和改,一个ViewModel可以绑定到不同的View上,当View变化的下Model可以无变换,当Model变化之时段View也足以免转换。
  1. 然而重用性。可以管有视图的逻辑在ViewModel里面,让无数View重用这段视图逻辑。
  1. 独自开发。开发人员可以小心以及业务逻辑和数目的开(ViewModel)。设计人员好小心让界面(View)的统筹。
  1. 只是测试性。可以针对ViewModel来针对界面(View)进行测试

MVP:本小编没有碰,希望得以得到大家之辅助。可以当底下留言。

3.胡代理要就此weak?代理的delegate和dataSource有什么分别?block和代理的区别?

代办是应用weak来修饰的。1.使weak是以避免循环引用。2.当动weak修饰的性质,当对象释放的早晚,系统会对性赋值nil,object-c有只性状就是是本着nil对象发送信息啊就算是调用方法,不会见cash。
delegate:表示代理,代理可以让A对象通知B对象,我(A)发生的变通,前提B遵循了A的代理,并且实现了A的代办方。
dataSource:表示数据源,如果A对象声明了数据源,当我们创建A对象的上,我们就该兑现数据源,来告诉A,他所待的一些数据。例如:tableView数据源方法,需要告诉它,我如果实现几乎组cell,每组cell多少行cell,实现之cell什么样式,什么内容
同样delegate
dataSource,都是好采用requireoptional来修饰的。

代理和Block的区别

相同点:代理及Block大多是我们还可以为此来开倒序传值的。我们都得留心避免循环引用。
不同点:代理使用weak修饰,代理要优先声明方法。当我们调用代理的时刻如果判断是否曾落实。
block:使用的是copy来编排饰,block保存的凡同样截代码,其实也不怕是一个函数。当我们调用block的下如果判是否早已落实。

4.属性的精神是什么?包括哪几独片?属性默认的重要性字都发出什么?@dynamic关键字和@synthesize关键字是故来开啊的?

性是讲述类的特征,也就算是颇具什么特色。三只有,带下划线的成员变量,get、setter方法。
默认关键字:readwrite,assign, atomic;
@dynamic
:修饰的性能,其getter和setter方法编译器是不会见自行帮您别。必须协调是兑现的。
@synthesize:修饰的特性,其getter和setter方法编译器是会见自动帮您转移。不必自己实现,可以指定同性相对应之积极分子变量。

5.属性的默认关键字是啊?

默认关键字:readwrite,assign, atomic;

6.NSString怎么要就此copy关键字,如果就此strong会生出什么问题?(注意:这里没说用strong就必将非常。使用copy和strong是看情况而肯定的

不言而喻,我们知道,可变类型(NSMutableArray,NSMutableString等)是不可边类型(NSString,NSArray等)的子类,因为多态的原因,我们得以以赋值指向子类对象,也就是是我们得使不可边类型去受而变类型。
1.当我们用strong修饰A不可边类型的时刻,并且采用B可变类型给A赋值,再错过修改只是变类型B值的当儿,A所指向的值也会时有发生变更。引文strong只是被创建的目标引用计数器+1,并赶回时目标的内容地址,当我们修改B指向的情节之时候,A指向的情吗一如既往产生了变更,因为他们指向的内存地址是相同的,是一份内容。
2.当我们使用copy修饰A不可边类型的时光,并且以B可变类型给A赋值,再去窜只是变类型B值的上,A所针对的价值不见面产生反。因为这因故copy的梳洗的时候,会拷贝一客内容出来,并且返回指针给A,当我们修改B指向的始末之早晚,A指向的始末是不曾生反的。因为A指向的内存地址和B指向的内存地址是不相同的,是两份内容
3.copy修饰不可边类型(NSString,NSArray等)的时,且下不可边类型进行赋值,意味着浅拷贝,只拷贝一客指针,和strong修饰一样,当修饰的是可变类型(NSMutableArray,NSMutableString等)的时刻,表示深拷贝,直接拷贝新一客内容,到内存中。表示两卖内容。

7.争使自己所描绘的目标拥有拷贝功能?

务必依nscopying商讨,如果想实现可变和不可边拷贝时,必须同时按nscopingnsmutablecoping说道。并且实现

  • (id)copyWithZone:(NSZone *)zone;

8.可变集合类 和 不可变集合类的 copy 和 mutablecopy有什么界别?如果是聚众是情复制的话,集合里面的元素呢是内容更制么?

但更换使用copy表示深拷贝,不可变集合类使用copy的时段是浅拷贝。
而是变集合类使用mutablecopy表示深拷贝,不可变集合类使用copy的时节是浅拷贝。
至于容器实现copy 或 metableCopy ,容器内元素默认都是
指针拷贝,不是情复制。

9.为什么IBOutlet修饰的UIView也适用weak关键字?

当xib或者Sb拖控件时,其实控件便加载到了大人控件的subviews数组里面,进行了大引用,即使使用了weak,也不招对象的假释。

10.nonatomic和atomic的分?atomic是绝的线程安全么?为什么?如果不是,那该怎样实现?

nonatomic:表示非原子,不安全,但是效率高。
atomic:表示原子行,安全,但是效率肯定。
atomic:不可知绝对保证线程的安全,当多线程同时做客的早晚,会促成线程不安全。可以利用线程锁来保管线程的安康。

11.UICollectionView起定义layout如何实现?

贯彻一个自定义layout的例行做法是继承UICollectionViewLayout类,然后重载下列方法:

-(CGSize)collectionViewContentSize
返回collectionView的内容的尺寸
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
返回rect中的所有的元素的布局属性
返回的是包含UICollectionViewLayoutAttributes的NSArray
UICollectionViewLayoutAttributes可以是cell,追加视图或装饰视    图的信息,通过不同的UICollectionViewLayoutAttributes初始化方法可以得到不同类型的UICollectionViewLayoutAttributes:
   layoutAttributesForCellWithIndexPath:
   layoutAttributesForSupplementaryViewOfKind:withIndexPath:
layoutAttributesForDecorationViewOfKind:withIndexPath:
  -(UICollectionViewLayoutAttributes )layoutAttributesForItemAtIndexPath:(NSIndexPath )indexPath
返回对应于indexPath的位置的cell的布局属性
-(UICollectionViewLayoutAttributes )layoutAttributesForSupplementaryViewOfKind:(NSString )kind atIndexPath:(NSIndexPath *)indexPath
返回对应于indexPath的位置的追加视图的布局属性,如果没有追加视图可不重载
-(UICollectionViewLayoutAttributes * )layoutAttributesForDecorationViewOfKind:(NSString)decorationViewKind atIndexPath:(NSIndexPath )indexPath
返回对应于indexPath的位置的装饰视图的布局属性,如果没有装饰视图可不重载
-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
当边界发生改变时,是否应该刷新布局。如果YES则在边界变化(一般是scroll到其他地方)时,将重新计算需要的布局信息。

12.据此StoryBoard开发界面有什么坏处?如何避免?

应用简易逻辑页面的跳转是得下sb的,开发比较块。
可是SB对于逻辑项目比较复杂的时,开发起来比缓慢。不符合多丁合作开发;也不便利版本的梗系和底的护卫。使用sb在类型变异编译的时节,也都见面一直加载到内存中,造成内存的浪费。
可下xib来取代,编辑复杂逻辑界面上可采取纯码编写。

13.过程同线程的区别?同步异步的分别?并行和出现的分别?

进程:是享有自然独立力量的次序关于某个数集合上的同等差运行活动,进程是系开展资源分配和调度的一个独立单位.
线程:大凡过程的一个实体,是CPU调度以及分担的中坚单位,它是较进程再小之克独运转的基本单位.线程自己多不富有系统资源,只享有一点以运作面临必不可少的资源(如程序计数器,一组寄存器和货栈),但是它们只是与同属一个过程的外的线程共享进程所独具的全方位资源.
同步:死时线程操作,不可知开发线程。
异步:莫阻拦线程继续操作,可以开辟线程来推行任务。
并发:当有差不多只线程在操作时,如果系统只生一个CPU,则它向无可能确实以进行一个上述之线程,它不得不将CPU运行时分开成几独时刻段,再将日
段分配受各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们誉为并发(Concurrent)。
并行:当系统出一个上述CPU时,则线程的操作发生或非并发。当一个CPU执行一个线程时,另一个CPU可以执行另外一个线程,两只线程互不抢占CPU资源,可以又展开,这种措施我们称为并行(Parallel)。
区别:并发和互动是就是一般并且发生分别之少个概念,并行是依区区单或多单事件于平等时刻发生;而起是乘区区独或多个事件于同一时间间隔内发生。在多道程序环境下,并发性是负于一段时间内主上发多独程序在同时运行,但每当单处理机系统面临,每一样时刻却仅仅会发生一块程序执行,故微观上这些程序只能是分时地轮流执行。倘若在处理器体系受生差不多单处理机,则这些可以并作执行之次第就算可叫分配到差不多独处理机上,实现并行执行,即采取每个处理机来处理一个只是连作执行的次,这样,多只次就算可又履行。

14.线程间通信?

当用dispath-async函数开辟线程执行任务之就时,我们要利用dispatch_async(dispatch_get_main_queue(),
^{ });函数会到主线程内刷新UI。并成功通信

15.GCD的片常用之函数?(group,barrier,信号量,线程同步)

我们采用队列组来开发线程时,队列组中的排任务是出新,当有的队列组中之富有任务完成时,才堪调用队列组完成任务。

/**创建自己的队列*/
dispatch_queue_t dispatchQueue = dispatch_queue_create("ted.queue.next", DISPATCH_QUEUE_CONCURRENT);
/**创建一个队列组*/
dispatch_group_t dispatchGroup = dispatch_group_create();
/**将队列任务添加到队列组中*/
dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
    NSLog(@"dispatch-1");
});
   /**将队列任务添加到队列组中*/
dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
    NSLog(@"dspatch-2");
});
  /**队列组完成调用函数*/
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
    NSLog(@"end");
})

barrier:表示栅栏,当在产出队列中用栅栏上,栅栏之前的产出任务开始起执行,执行了后,执行栅栏外之职责,等栅栏任务履行完毕后,再连作执行栅栏后的任务。

dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(concurrentQueue, ^(){
    NSLog(@"dispatch-1");
});
dispatch_async(concurrentQueue, ^(){
    NSLog(@"dispatch-2");
});
dispatch_barrier_async(concurrentQueue, ^(){
    NSLog(@"dispatch-barrier"); 
});
dispatch_async(concurrentQueue, ^(){
    NSLog(@"dispatch-3");
});
dispatch_async(concurrentQueue, ^(){
    NSLog(@"dispatch-4");
});

信号量:Semaphore是通过‘计数’的法子来标识线程是否是待或继续执行的。信号量

dispatch_semaphore_create(int) // 创建一个信号,并初始化信号的计数大小
/* 等待信号,并且判断信号量,如果信号量计数大于等于你创建时候的信号量的计数,就可以通过,继续执行,并且将你传入的信号计数减1,
 * 如果传入的信号计数小于你创建的计数,就表示等待,等待信号计数的变化
 *  如果等待的时间超过你传入的时间,也会继续下面操作
 *   第一个参数:semaphore 表示信号量
 *   第二个参数:表示等待的时间
 *    返回int 如果传入的信号计数大于等于你创建信号的计数时候,返回0.  反之,返回的不等于0
 */
 int result = dispatch_semaphore_wait(dispatch_semaphore_t  semaphore,time outTime);// 表示等待,也是阻碍线程
// 表示将信号技术+1
dispatch_semaphore_signl(dispatch_semaphore_t semaphore);

落实线程的一起的主意:串行队列,分组,信号量。也是可以以并发队列。

   //加入队列
dispatch_async(concurrentQueue, ^{
    //1.先去网上下载图片
    dispatch_sync(concurrentQueue, ^{

    });
    //2.在主线程展示到界面里
    dispatch_sync(dispatch_get_main_queue(), ^{

    });
});

16.怎么下队列来避免资源掠夺?

当我们利用多线程来看与一个数的上,就生出或导致数的禁确性。这个时段我么可以使用线程锁的来来绑定。也是可以动用串行队列来成功。如:fmdb就是以FMDatabaseQueue,来缓解多线程抢夺资源。

17.数量持久化的几乎独方案(fmdb用无因此了)

持久化方案:
plist,存储字典,数组比较好用
preference:偏好设置,实质也是plist
NSKeyedArchiver:归档,可以储存对象
sqlite:数据库,经常应用第三正值来操作,也尽管是fmdb
coreData:也是数据库储存,苹果官方的

18.说一下appdelegate的几乎独道?从后台到前台调用了安措施?第一不善开行调用了哪些方法?从前台到后台调用了什么样措施?

图片 1

1029210 (1).gif

19.NSCache优于NSDictionary的几点?

1.nscache 是可以自行释放内存的。
2.nscache凡线程安全之,我们好于不同之线程中添加,删除和查询缓存中之目标。
3.一个缓存对象不见面拷贝key对象。

20.知不知道Designated Initializer?使用其的下来什么得专注的问题?

个人理解:初始化函数,如果你想打定义初始化函数时,也是得使初始化父类,以来保证可以持续父类的片段法要性质。
Designated
Initializer

21.兑现description方法能够得到什么意义?

description是nsobject的一个实例的计,返回的是一个nsstring。当我们采用nslog打印的时刻,打印出来的形似都是目标的内存地址,如果我们贯彻description方法时,我们尽管可以采用nslog打印对象的时,我们得以把她里面的属性值和内存地址一起打印出来.打印什么,就是看君写什么了。

-(NSString *)description{  
      NSString * string = [NSString stringWithFormat:@"<Person:内存地址:%p name = %@ age = %ld>",self,self.name,self.age];  
      return string;      
}  

22.objc行使啊机制管理目标内存?

应用内存管理计数器,来保管内存的。当内存管理计数器为0的时光,对象就会给放出。

中级

Block

1.block的真面目是啊?一共发生几栽block?都是呀情况下转移的?

block:本质就是一个object-c对象.
block:存储位置,可能分为3单地方:代码去,堆区、栈区(ARC情况下会自行拷贝到堆区,因此ARC下只能发出一定量只地方:代码去、堆区)
代码区:不看栈区的变量(如有变量),且无聘堆区底变量(alloc创建的对象),此时block存放于代码去。
堆区:访问了远在栈区的变量,或者堆区的变量,此时block存放在堆区。–需要留意实际是置身栈区,在ARC情况下会活动拷贝到堆区,如果未是ARC则存放于栈区,所在函数执行了便掉释放,想重新外面调用需要因此copy指于它,这样尽管拷贝到了堆区,strong属性不会见拷贝、会招致野指针错区。

2.胡当默认情况下无法修改被block捕获的变量? __block都召开了哟?

默认情况下,block里面的变量,拷贝进去的是变量的价,而未是赖为变量的内存的指针。
当使用__block修饰后的变量,拷贝到block内的便是依靠为变量的指针,所以我们尽管可改变量的值。

3.效仿一下循环引用的一个气象?block实现界面反往传值如何落实?

 Person *p = [[Person alloc]init];
[p setPersonBlock:^(NSString *str) {
    p.name = str;
}];

Runtime

1.objc在向一个对象发送信息时,发生了啊?

基于目标的isa指南针找到类似对象id,在查询类对象中的methodLists方函数列表,如果无于好到,在沿superClass,寻找父类,再以父类methodLists道列表中查询,最终找到SEL,根据idSEL确认IMP(指针函数),在发送信息;

3.呀时会报unrecognized selector错误?iOS有安机制来避免倒及就同一步?

当发送信息之时候,我们见面根据类里面的methodLists列表去询问我们如果用的SEL,当查问不顶的当儿,我们见面直接本着父类查询,当最后查询不至之时我们会报unrecognized
selector错误

当系统查询不交方式的下,会调用+(BOOL)resolveInstanceMethod:(SEL)sel动态解释的主意来让自己同软机会来增长,调用不顶的方。或者我们得再次用-(id)forwardingTargetForSelector:(SEL)aSelector重定向的法来喻系统,该调用啊点子,一来保证不见面崩溃。

4.是否为编译后获得的类吃加进实例变量?能否朝着运行时创造的切近吃补充加实例变量?为什么?

1.免可知望编译后拿走的类似增加实例变量
2.力所能及为运行时创造的好像中上加实例变量
解释:
1.编译后之近乎都注册于runtime中,类结构体中的objc_ivar_list实例变量的链表和instance_size实例变量的内存大小已经确定,runtime会调用class_setvarlayout或class_setWeaklvarLayout来拍卖strong
weak引用.所以不克通往有的近乎中补充加实例变量
2.周转时创造的类是足以增长实例变量,调用class_addIvar函数.但是的在调用objc_allocateClassPair之后,objc_registerClassPair之前,原因及上.

5.runtime什么样促成weak变量的自动置nil?

runtime 对注册的切近, 会进行布局,对于 weak 对象会放入一个 hash 表中。
用 weak 指向的靶子内存地址作为 key,当此对象的援计数为0的上会
dealloc,假如 weak 指向的目标内存地址是a,那么就会盖a为键, 在这个
weak 表中追寻,找到有坐a为键的 weak 对象,从而设置为 nil。

6.被类添加一个性后,在近似结构体里安元素会发生变化?

instance_size :实例的内存大小
objc_ivar_list *ivars:属性列表

RunLoop

1.runloop是来做呀的?runloop和线程有啊关系?主线程默认被了runloop么?子线程呢?

runloop:字面意思就是是跑圈,其实为就是是一个循环跑圈,用来拍卖线程里面的事件与消息。
runloop和线程的涉嫌:每个线程如果想继续运行,不吃放飞,就必须发一个runloop来非歇的跑圈,以来处理线程里面的逐条事件以及消息。
主线程默认是开启一个runloop。也就是其一runloop才能够担保我们先后正常化的周转。子线程是默认没有起来runloop的

2.runloop的mode是故来开啊的?有几乎种mode?

model:是runloop里面的模式,不同之模式下之runloop处理的波及信来肯定之出入。
系统默认注册了5单Mode:
(1)kCFRunLoopDefaultMode: App的默认 Mode,通常主线程是在这 Mode
下运作的。
(2)UITrackingRunLoopMode: 界面跟踪 Mode,用于 ScrollView
追踪触摸滑动,保证界面滑动时未让任何 Mode 影响。
(3)UIInitializationRunLoopMode: 在刚启动 App 时先后进入的第一独
Mode,启动成功后虽不再采取。
(4)GSEventReceiveRunLoopMode: 接受系统事件之其中
Mode,通常用不至。
(5)kCFRunLoopCommonModes: 这是一个占位的 Mode,没有实际作用。
注意iOS 对以上5受到model进行了打包
NSDefaultRunLoopMode;
NSRunLoopCommonModes

3.为什么把NSTimer对象为NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环以后,滑动scrollview的时NSTimer却不动了?

nstime对象是以
NSDefaultRunLoopMode下面调用消息之,但是当我们滑动scrollview的时候,NSDefaultRunLoopMode模式就是活动切换至UITrackingRunLoopMode模式下,却未得以继承响应nstime发送的信。所以一旦想以滑scrollview的情况下面还调用nstime的音信,我们得以把nsrunloop的模式改变为NSRunLoopCommonModes

4.苹果是怎么样落实Autorelease Pool的?

Autorelease
Pool作用:缓存池,可以免我们经常写relase的一样种植艺术。其实就是是延迟release,将创的靶子,添加到近来底autoreleasePool中,等到autoreleasePool作用域结束之时光,会拿内有着的目标的援计数器-1.
autorelease

类结构

1.isa指针?(对象的isa,类对象的isa,元类的isa都要说)

于oc中,类为是目标,所属元类。所以时说:万物皆对象

靶的isa指针指向所属的切近
类似的isa指针指于了所属的元类
元类的isa指为了根元类,根元类指向了祥和。

图片 2

AC17D0A0-CB2A-4C23-8430-4BC7A99571CE.png

2.类艺术及实例方法来啊界别?

调用的法子各异,类措施必须采用类调用,在点子中未能够调用属性,类措施中也须调用类方法。存储在元类结构体里面的methodLists里面
实例方法要采取实例对象调用,可以当实例方法中用性质,实例方法吧必须调用实例方法。存储于看似结构体里面的methodLists里面

3.介绍一下分拣,能用分类做什么?内部是如何促成之?它为什么会挂掉原来的章程?

category:我们可给类或者系统类添加实例方法措施。我们抬高的实例方法,会受动态的丰富顶类似组织中的methodList列表中。categort

4.周转时能够多成员变量么?能多属性么?如果能够,如何增加?如果无克,为什么?

可以互补加属性的,但不能不我们实现它的gettersetter法。但是从未上加带下滑线同名的成员变量
可我们采取runtime咱俩尽管可兑现增长成员变量方法如下

- (void)setName:(NSString *)name {
/**
 *  为某个类关联某个对象
 *
 *  @param object#> 要关联的对象 description#>
 *  @param key#>    要关联的属性key description#>
 *  @param value#>  你要关联的属性 description#>
 *  @param policy#> 添加的成员变量的修饰符 description#>
 */
  objc_setAssociatedObject(self, @selector(name), name,   OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)name {
/**
 *  获取到某个类的某个关联对象
 *
 *  @param object#> 关联的对象 description#>
 *  @param key#>    属性的key值 description#>
 */
return objc_getAssociatedObject(self, @selector(name));
}

5.objc中往一个nil对象发送信息将会晤时有发生啊?(返回值是目标,是标量,结构体)


如果一个措施返回值是一个目标,那么发送给nil的音将回回0(nil)。例如:Person
* motherInlaw = [ aPerson spouse] mother];
如果spouse对象啊nil,那么发送给nil的消息mother也拿回来nil。

如果艺术返回值为指针类型,其指针大小也小于或者当sizeof(void*),float,double,long
double 或者long long的整型标量,发送给nil的消息将回来回0。
• 如果方式返回值为结构体,正而在《Mac OS X ABI
函数调用指南》,发送给nil的音讯将回来回0。结构体中各个字段的值将还是0。其他的结构体数据类型将未是用0填充的。

如果措施的归来值不是上述提到的几种状况,那么发送给nil的消息之归值将是不定义的。

详见解答

高级

1.UITableview底优化措施(缓存高度,异步绘制,减少层级,hide,避免离屏渲染)

缓存高度:当我们创建frame模型的时,计算出来cell的冲天的上,我们得用cell的万丈缓存到字典里面,以cell的indexpathIdentifier作为为key。

NSString *key = [[HeightCache shareHeightCache] makeKeyWithIdentifier:@"YwywProductGradeCell" indexPath:indexPath];
if ([[HeightCache shareHeightCache] existInCacheByKey:key]) {
    return [[HeightCache shareHeightCache] heightFromCacheWithKey:key];
}else{
    YwywProductGradeModelFrame *modelFrame = self.gradeArray[indexPath.row];
    [[HeightCache shareHeightCache] cacheHieght:modelFrame.cellHight key:key];
    return modelFrame.cellHight;
}

异步绘制、减少层级:目前尚非是那个懂
hide:个人知道应该是hidden吧,把可能会见因此到之控件都创出来,根据不同的状态去潜伏或者显示出来。
避免离屏渲染:只要不是又采取边框/边框颜色以及圆角的时候,都可以动用layer直接设置。不会见招致离屏渲染。

2.起没起因此过运行时,用它们都能举行什么?(交换方法,创建类,给新创办的接近增加方法,改变isa指针)

换成方式:一般写于近似的+(void)load方法中

   /** 获取原始setBackgroundColor方法 */
Method originalM = class_getInstanceMethod([self class], @selector(setBackgroundColor:));
/** 获取自定义的pb_setBackgroundColor方法 */
Method exchangeM = class_getInstanceMethod([self class], @selector(pb_setBackgroundColor:));
/** 交换方法 */
method_exchangeImplementations(originalM, exchangeM);
创建类:
Class MyClass = objc_allocateClassPair([NSObject class], "Person", 0);
增长法
/**参数一、类名参数
   二、SEL 添加的方法名字参数
    三、IMP指针 (IMP就是Implementation的缩写,它是指向一个方法实现的指针,每一个方法都有一个对应的IMP)
  参数四、其中types参数为"i@:@“,按顺序分别表示:具体类型可参照[官方文档](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html)i 返回值类型int,若是v则表示void@ 参数id(self): SEL(_cmd)@ id(str)
  V@:表示返回值是void 带有SEL参数 (An object (whether statically typed or typed id))
  */
class_addMethod(Person, @selector(addMethodForMyClass:), (IMP)addMethodForMyClass, "V@:");
增长实例变量
/**参数一、类名参数
  二、属性名称参数
  三、开辟字节长度参数
  四、对其方式参数
  五、参数类型 “@” 官方解释 An object (whether statically typed or typed id) (对象 静态类型或者id类型) 具体类型可参照[官方文档](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html)return: BOOL 是否添加成功
  */
BOOL isSuccess = class_addIvar(Person, "name", sizeof(NSString *), 0, "@");
isSuccess?NSLog(@"添加变量成功"):NSLog(@"添加变量失败");

3.扣了哪些第三正值框架的源码?都是怎么促成之?(如果没有,问一下大抵贪图下载的计划)

4.SDWebImage的休息存策略?

sd加载一布置图片的时,会先在内存里面找是否来立张图片,如果没有见面因图片的md5(url)后底号去沙盒里面去搜寻,是否发生及时张图片,如果没有见面开发线程去下载,下充斥了毕后加载到imageview上面,并md(url)为名称缓存到沙盒里面。

5.AFN为何加加相同长达常驻线程?

AFN
目的:就是开辟线程请求网络数据。如果无常住线程的话,就会每次要网络就是去开拓线程,完成之后销毁开辟线程,这样即便招致资源的浪费,开辟一久常住线程,就可以避免这种浪费,我们得以在每次的网要都抬高到就条线程。

6.KVO的运?实现原理?(为什么要开创子类来实现)

kvo:键值观察,根据键对应的价的转移,来调用方法。
登记观察者:addObserver:forKeyPath:options:context:
实现观察者:observeValueForKeyPath:ofObject:change:context:
移除观察者:removeObserver:forKeyPath:(对象销毁,必须移除观察者)
注意
采用kvo监听A对象的时段,监听的实质不是者A对象,而是系统创造的一个中间对象NSKVONotifying_A并继承A对象,并且A对象的isa指针指向的呢无是A的好像,而是以此NSKVONotifying_A对象
kvo详解
kvo详解2

7.KVC的动?实现原理?(KVC拿到key以后,是怎么样赋值的?知不知道集合操作符,能不能够访问私有属性,能无克直接看_ivar)

kvc:键值赋值,使用最多之尽管字典转模型。利用runtime获取对象的具有成员变量,
在依据kvc键值赋值,进行字典转模型
setValue: forKey: 只摸本类里面的性质
setValue:
forKeyPath:会找本类里面属性,没有见面延续找父类里面属性。
kvc详解

项目

1.闹曾上线的型也?

2.种里谁部分是若完成的?(找一个亮点问一下哪实现之)

3.付出进程被碰到了什么困难,是哪些化解之?

学习

4.遇到一个题材了无克清楚的时刻,是怎么样扶持协调理解的?举个例?

5.来看开之惯也?最近看的如出一辙本是什么开?有啊感受?

6.发出没产生应用有记软件?会当多平台联手跟多渠道采集么?(如果没,问一下凡是怎样复习知识之)

7.有无发生采取清单类,日历类的软件?(如果没有,问一下是何许安排,计划任务的)

8.平淡无奇看博客么?有无出好写了?(如果写,有什么样收获?如果没有写,问一下请勿写的因)

以上就是全体之面试题,后面的面试题,就该根据个人的情景来应对了。
如上的面试回答,有的是根据自己的知识储备对,有的吧是稍稍编百度的。
上述的回复也非知道对和错,欢迎大家发表自己的理念

作者:七秒记忆的鱼儿
链接:http://www.jianshu.com/p/f9eb6b315c08
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
网站地图xml地图