A:为了不循环引用。weak指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制。strong该对象强引用delegate,外界不能销毁delegate对象,会致使循环引用。DataSource是关于View的内容的东西包括属性,数据等等,而Delegate则是一些咱们能够调用的方法,全是操做。block和代理都能解决对象间交互的问题,block更轻型,更简单,可以直接访问上下文,代码一般在同一个地方,这样读代码也连贯。缺点是容易引发循环引用。delegate更重一些,须要实现接口,它的方法分开来,不少时候须要存储一些临时数据,另外相关的代码须要分离到各处没有block好读,其优势就是它是用weak关键字修饰的,不会引发循环引用。面试
A:属性的本质是@property = ivar+getter+setter,也就是说@property系统会自动生成getter和setter方法。属性默认的关键字包括atomic,nonatomic,@synthesize,@dynamic,getter=getterName,setter=setterName,readwrite,readonly,assign,retain,copy。
@dynamic:表示变量对应的属性访问器方法,是动态实现的,你须要在 NSObject 中继承而来的 +(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定 动态实现的方法或者函数。
@synthesize:若是没有实现setter和getter,编译器可以自动实现getter和setter方法。swift
A:针对于当把NSMutableString赋值给NSString的时候,才会有不一样,用copy的话NSString的值不会发生变化,用strong则会发生变化,随着NSMutableString的值变化。若是是赋值是NSString对象,那么使用copy仍是strong,结果都是同样的,由于NSString对象根本就不能改变自身的值,他是不可变的。缓存
A:若想让本身写的对象具备拷贝功能,则须要实现NSCopying协议。若是自定义的对象分为可变版本和非可变版本,那么就要同时实现NSCopying和NSMutableCopying协议,不过通常没什么必要,实现NSCopying协议就够了。安全
A:对于不可变对象,copy操做是浅复制,mutableCopy是深复制。对于不可变对象,mutableCopy不只仅是深复制,返回的对象类型仍是不可变对象类型相应的可变对象的类型。内容复制也就是深拷贝,集合的深复制有两个方法,能够用initWithArray:copyItems:将第二个参数设置为YES便可进行深复制,如:NSDictionary *shallowCopyDict = [NSDictionary alloc]initWithDictionary:someDictionary copyItems:YES];若是用这个方法深复制,集合里的每一个元素都会收到copyWithZone:消息。若是集合里的对象遵循NSCopying协议,那么对象就会深复制到新的集合。若是对象没有遵循NSCopying协议,而尝试用这种方法进行深复制则会出错。copyWithZone:这种拷贝方式只能提供一层内存拷贝,而非真正的深拷贝。第二种方法是将集合进行归档解档,如:NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];bash
A:由于既然有外链那么视图在xib或者storyboard中确定存在,视图已经对它有一个强引用了。
——————————————————————————————————————————服务器
做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个个人点击加入群聊iOS交流群:789143298 ,无论你是小白仍是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 你们一块儿交流学习成长!微信
——————————————————————————————————————————markdown
A:nonatomic和atomic的区别在于二者自动生成getter和setter的方法不同,若是你本身写getter和setter方法,那么(getter,setter,retain,copy,assign)只起提示做用,写不写都同样。
对于atomic的属性,系统生成的getter和setter会保证get,set的操做完整性,不受其余线程影响。好比线程A的getter方法运行到一半,线程B调用了setter,那么线程A的getter仍是能获得一个完整的对象。
而nonatomic就没有这个保证了,因此速度要比atomic快。
不过atomic可不能保证线程安全,若是线程A调用了getter,与此同时线程B和线程C都调了setter,那最后线程Aget到的值,三种都有可能:多是B,C set以前原始的值,也多是B set的值,也多是C set的值。同时这个最终的值,也多是B set的值,也多是C set的值。要保证安全,可使用线程锁。网络
A:UICollectionViewLayoutAttributes,UICollectionViewFlowLayout。多线程
A:难以维护,若是须要改动全局的一个字体,若是是代码的话就很好办,pch或头文件中改动就行了。若是是storyboard中就须要一个一个改动很麻烦。
若是storyboard中scene太多,打开storyboard会比较慢。
错误定位比较困难,好多错误提示模棱两可。
A:进程是一个内存中运行的应用程序,好比在Windows系统中,一个运行的exe就是一个进程。
线程是指进程中的一个执行流程。
同步是顺序执行,执行完一个再执行下一个。须要等待,协调运行。
异步就是彼此独立,在等待某事件的过程当中继续作本身的事,不须要等待这些事件完成后再工做。
并行和并发 是前者至关于三我的同时吃一个馒头,后者至关于一我的同时吃三个馒头。
并发性(Concurrence):指两个或两个以上的事件或活动在同一时间间隔内发生。并发的实质是一个物理CPU(也能够多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提升效率。
并行性(parallelism)指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不一样CPU上同时执行。
区别:(并发)一个处理器同时处理多个任务和(并行)多个处理器或者是多核的处理器同时处理多个不一样的任务。
A:NSThread、GCD、NSOperation。
A:1.延迟执行任务函数:dispatch_after(.....)。
2.一次性执行dispatch_once(...)。
3.栅栏函数dispatch_barrier_async/dispatch_barrier_sync。
4.队列组的使用dispatch_group_t。
5.GCD定时器。
A:dispatch_barrior_async 做用是在并行队列中,等待前面两个操做并行操做完成。
A:Coredata,realm,fmdb。
A:
1.当程序第一次运行而且将要显示窗口的时候执行,在该方法中咱们完成的操做
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
复制代码
2.程序进入后台的时候首先执行程序将要取消活跃该方法
- (void)applicationWillResignActive:(UIApplication *)application
复制代码
3.该方法当应用程序进入后台的时候调用
- (void)applicationDidEnterBackground:(UIApplication *)application
复制代码
4.当程序进入将要前台的时候调用
- (void)applicationWillEnterForeground:(UIApplication *)application
复制代码
5.应用程序已经变得活跃(应用程序的运行状态)
- (void)applicationDidBecomeActive:(UIApplication *)application
复制代码
6.当程序将要退出的时候调用,若是应用程序支持后台运行,该方法被applicationDidEnterBackground:替换
- (void)applicationWillTerminate:(UIApplication *)application
复制代码
A:NSCache 是一个容器类,相似于NSDIctionary,经过key-value 形式存储和查询值,用于临时存储对象。
注意一点它和NSDictionary区别就是,NSCache 中的key没必要实现copy,NSDictionary中的key必须实现copy。
NSCache中存储的对象也没必要实现NSCoding协议,由于毕竟是临时存储,相似于内存缓存,程序退出后就被释放了。
A:好比:
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
复制代码
A:1.NSLog(@"%@", objectA);这会自动调用objectA的description方法来输出ObjectA的描述信息.
2.description方法默认返回对象的描述信息(默认实现是返回类名和对象的内存地址)
3.description方法是基类NSObject 所带的方法,由于其默认实现是返回类名和对象的内存地址, 这样的话,使用NSLog输出OC对象,意义就不是很大,由于咱们并不关心对象的内存地址,比较关心的是对象内部的一些成变量的值。所以,会常常重写description方法,覆盖description方法的默认实现。
A:经过 retainCount 的机制来决定对象是否须要释放。 每次 runloop 的时候,都会检查对象的 retainCount,若是retainCount 为 0,说明该对象没有地方须要继续使用了,能够释放掉了。
A:block对象就是一个结构体,里面有isa指针指向本身的类(global malloc stack),有desc结构体描述block的信息,__forwarding指向本身或堆上本身的地址,若是block对象截获变量,这些变量也会出如今block结构体中。最重要的block结构体有一个函数指针,指向block代码块。block结构体的构造函数的参数,包括函数指针,描述block的结构体,自动截获的变量(全局变量不用截获),引用到的__block变量。(__block对象也会转变成结构体)
block代码块在编译的时候会生成一个函数,函数第一个参数是前面说到的block对象结构体指针。执行block,至关于执行block里面__forwarding里面的函数指针。
A:static inline内联函数:使用它能够减小函数运行时间,提升程序运行速度。但内联函数里不能写循环,开关语句,并且最好不写过于冗长的函数。
A:在声明property时,若是不指定关键字,编译器会为property生成默认的关键字。
对应基本数据类型,默认关键字为atomic,assign,readwrite。
对应对象类型,默认关键字为atomic,strong,readwrite。
A:在block中访问的外部变量是复制过去的,写操做不对原变量生效。
A:两个.h文件互相import了对方形成循环引用。block先声明(在要传值的controller里声明
typedef void(^MyBlock)(NSString *name);//block的重命名
@property (nonatomic,copy) MyBlock block;//block的声明),在准备接收值的页面里实现block,
secondVC.block = ^void(NSString *name)
{
_label.text = name;
};,谁要传值就在谁那里调用self.block(@"lalala");。
A:当咱们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图。在咱们点击屏幕的时候,iphone OS获取到了用户进行了“单击”这一行为,操做系统把包含这些点击事件的信息包装成UITouch和UIEvent形式的实例,而后找到当前运行的程序,逐级寻找可以响应这个事件的对象,直到没有响应者响应。这一寻找的过程,被称做事件的响应链。
不一样的响应者以链式方式寻找,AppDelegate->UIApplication->UIWindow->UIViewController->UIView->UIButton。
A:TCP链接:手机可以使用联网功能是由于手机底层实现了TCP/IP协议,可使手机经过无线网络创建TCP链接。TCP协议能够对上层网络提供接口,使上层网络数据的传输创建在“无差异”的网络上。
创建起一个TCP链接须要通过“三次握手”:
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时本身也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程当中传送的包里不包含数据,三次握手完毕后,客户端和服务器才正式开始传送数据。理想状态下,TCP链接一旦创建,在通讯双方中的任何一方主动关闭链接以前,TCP链接都将一直被保持下去。断开链接时服务器和客户端都可主动发起断开TCP链接的请求,断开过程须要通过“四次握手”。
HTTP链接:HTTP协议即超文本传送协议,是Web联网的基础,也是手机联网经常使用的协议之一,HTTP协议是创建在TCP协议的一种应用。
HTTP链接最显著的特色是客户端发送的每次请求都须要服务器回送响应,在请求结束后,会主动释放链接。从创建链接到关闭链接的过程称为“一次链接”。
1.在HTTP 1.0中,客户端的每次请求都要求创建一次单独的链接,在处理完本次请求后,会自动释放链接。
2.在HTTP 1.1中则能够在一次链接中处理多个请求,而且多个请求能够重叠进行,不须要等待一个请求结束后再发送下一个请求。
因为HTTP在每次请求结束后都会主动释放链接,所以HTTP链接是一种短链接,要保持客户端程序的在线状态,须要不断地向服务器发起链接请求。一般的作法是即时不须要得到任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持链接”的请求,服务器在收到该请求后对客户端进行回复,代表知道客户端“在线”。若服务器长时间没法收到客户端的请求,则认为客户端“下线”,若客户端长时间没法收到服务器的回复,则认为网络已经断开。
A:1.URL Scheme
2.Keychain
3.UIPasteboard
4.UIDocumentInteractionController
5.Local socket
6.AirDrop
7.UIActivityViewController
8.App Groups