iOS常见问题

作者: LPrison | 来源:发表于2016-09-07 12:19 被阅读179次

    AppDelegate/ViewController生命周期

    viewController生命周期:alloc -> initWithNibName -> loadView -> viewDidLoad -> viewWillAppear -> viewDidAppear -> viewWillDisappear -> viewDidDisappear -> dealloc。---------------- loadView v.s. viewDidLoadview的nib文件为nil时,手工创建视图界面时调用loadView;当view的nib文件存在的时候,初始化工作在viewDidLoad中实现。loadView时view还没有生成,viewDidLoad时,view已经生成了。loadView方法用来创建一个新的view。loadView只会被调用一次,而viewDidLoad可能会被调用多次。AppDelegate生命周期:

    ◆- (void)applicationWillResignActive:(UIApplication *)application说明:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了

    ◆- (void)applicationDidBecomeActive:(UIApplication *)application说明:当应用程序入活动状态执行,这个刚好跟上面那个方法相反

    ◆- (void)applicationDidEnterBackground:(UIApplication *)application说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可

    ◆- (void)applicationWillEnterForeground:(UIApplication *)application说明:当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。

    ◆- (void)applicationWillTerminate:(UIApplication *)application说明:当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。

    ◆- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application说明:iPhone设备只有有限的内存,如果为应用程序分配了太多内存操作系统会终止应用程序的运行,在终止前会执行这个方法,通常可以在这里进行内存清理工作防止程序被终止

    ◆- (void)applicationSignificantTimeChange:(UIApplication*)application说明:当系统时间发生改变时执行

    ◆- (void)applicationDidFinishLaunching:(UIApplication*)application说明:当程序载入后执行

    ◆- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame说明:当StatusBar框将要变化时执行

    ◆- (void)application:(UIApplication*)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientationduration:(NSTimeInterval)duration说明:当StatusBar框方向将要变化时执行

    ◆- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url说明:当通过url执行

    ◆- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation说明:当StatusBar框方向变化完成后执行

    ◆- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame说明:当StatusBar框变化完成后执行

    当受到内存警告时,那么此时系统默认操作会检查当前视图控制器的view是否还在使用,如果没在使用且控制器实现了loadView方法,ViewController会将view release并将其指向为nil

    1 程序的入口

    进入main函数, 设置AppDelegate称为函数的代理

    2  程序完成加载

    -[AppDelegate application:didFinishLaunchingWithOptions:]

    3 创建window窗口

    4 程序被激活

    -[AppDelegate applicationDidBecomeActive:]

    5 当点击command+H时

    程序取消激活状态

    -[AppDelegate applicationWillResignActive:]

    程序进入后台

    -[AppDelegate applicationDidEnterBackground:]

    6 点击进入工程

    程序进入前台

    -[AppDelegate applicationWillEnterForeground:]

    程序被激活

    -[AppDelegate applicationDidBecomeActive:]

    post 和get的区别

    1. get是从服务器上获取数据,post是向服务器传送数据。

    2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

    3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

    4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

    5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

    建议:

    1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;

    2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

    SDWebImage图片缓存原理

    UIImageView+WebCache:  setImageWithURL:placeholderImage:options: 先显示 placeholderImage ,同时由SDWebImageManager 根据 URL 来在本地查找图片。

    SDWebImageManager: downloadWithURL:delegate:options:userInfo: SDWebImageManager是将UIImageView+WebCache同SDImageCache链接起来的类, SDImageCache: queryDiskCacheForKey:delegate:userInfo:用来从缓存根据CacheKey查找图片是否已经在缓存中

    如果内存中已经有图片缓存, SDWebImageManager会回调SDImageCacheDelegate : imageCache:didFindImage:forKey:userInfo:

    而 UIImageView+WebCache 则回调SDWebImageManagerDelegate:  webImageManager:didFinishWithImage:来显示图片。

    如果内存中没有图片缓存,那么生成 NSInvocationOperation 添加到队列,从硬盘查找图片是否已被下载缓存。

    根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:。

    如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。

    如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:。

    共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。

    图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。

    connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。

    connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理。

    图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。

    在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader。

    imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成。

    通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。

    将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。

    写文件到硬盘在单独 NSInvocationOperation 中完成,避免拖慢主线程。

    如果是在iOS上运行,SDImageCache 在初始化的时候会注册notification 到 UIApplicationDidReceiveMemoryWarningNotification 以及  UIApplicationWillTerminateNotification,在内存警告的时候清理内存图片缓存,应用结束的时候清理过期图片。

    SDWebImagePrefetcher 可以预先下载图片,方便后续使用。

    AFNetworking实现原理

    12-1 AFNetworking的原理与基本使用 - 简书

    kvc kvo区别

    KVC 与 KVO 理解

    类方法和实例方法的区别

    1、类方法是属于整个类,而不属于某个对象。

    2、类方法只能访问类成员变量,不能访问实例变量,而实例方法可以访问类成员变量和实例变量。

    3、类方法的调用可以通过类名.类方法和对象.类方法,而实例方法只能通过对象.实例方法访问。

    4、类方法只能访问类方法,而实例方法可以访问类方法和实例方法。

    5、类方法不能被覆盖,实例方法可以被覆盖。

    设计模式:MVC、工厂、代理、kvo

    1.MVC模式:

    现在绝大部分项目都是基于MVC模式,但是有一部分开发者采用MVVC和MVP模式

    MVC模式  :(Model - View - Controller)

    model:主要处理数据,Model中经常含有多个字段,通常来说就是存储数据。但是Model层也会有一部分简单的逻辑处理:(比如与系统重名关键字处理)

    View  :不应该包含逻辑,应该根据模型直接获取数据

    Controller :大部分的交互逻辑都集中在此处,所有View需要的数据,都是通过Controller提取Model,然后再交给View去展示数据

    MVVC模式 :(Model - View - ViewModel - Controller)是一个MVC的改进版本。 一般我们在正式连接了视图(View)和控制器(Controller)后,将标示逻辑从Controller中移除,放到一个一个新对象(View Model里面)。 MVVC 的优点:1.可以兼容你当下的MVC模式,2.增加应用的可测试性,3配合一个绑定机制效果更好

    MVP模式:(Model - View -protocal) MVP中的Model相当于MVVC中的View Model 层,Model里面既有逻辑层处理,又有提供协议对应的各种属性以及服务。

    2.KVC/KVO

    有时候需要监听某个类的属性值的变化而做出相应的改变,这时候就会用到KVC和KVO设计模式。比如在项目中,我需要监听model的某个属性值的变化,当变化时候,需要更新UI显示,这时候用KVC/KVO设计模式就很方便

    KVC : (Key - Value  Conding) 是键值编码。是指间接访问属性,使用字符串来标示属性,而不通过调用存取方法(setter,getter),或是直接实例化变量(如model.name)

    KVO:(key - Value Observing) 添加观察者,对某一个对象的某一个属性感兴趣,当这个属性发生变化的时候,会通知观察者

    3.通知(NSNotification)模式

    通知在开发中必不可少的,对于跨模块的类交互,需要使用通知;对于多对多关系,使用通知更好实现。

    4.单例模式

    单例就是指全局中只有一个对象存在,用于全局共享资源,每个APP都有单例如UIApplication ,如系统的单例:NSUserDefault,NSFileManager,NSNotificationCenter等等。一般应用场景管理类,引擎类,比如我们一般做用户信息储存时,通常会用单例储存,因为在一些应用操作的时候,经常需要先登陆。单例也有缺点,单例一旦创建,在APP整个使用过程中,都不会被销毁,这占用一定的内存空间,因此不可滥用单例。

    5.代理模式

    Delegate就是代理,代理是一种设置模式。在IOS开发中会使用大量的代理模式,常见的应用场景就是反向传值。

    6.工厂方法

    在项目中大量使用工厂设计模式,特别是生成控件的API,已经封装成一套,全部都是扩展的类方法,这样可以简化很多代码

    iOS 7 8 9 的区别

    iOS6、7、8、9新特性汇总和适配说明 - 简书

    继承和扩展和类别的区别

    1.类别(category)应用非常常见,特别是在为系统类进行扩展的时候,我们可以不用继承系统类,直接给系统类添加方法。最大程度上体现了OC语言的动态性。但是类别只能添加方法不能添加属性。

    2.扩展(Extention)

    3.继承(inherit),一个类(子类)继承于另一个类(父类),那么子类不仅拥有父类所有的属性和方法,而且可以创建属于自己的属性和方法。

    4.类别和继承的使用,以下两种情况只能使用继承,类别无法实现。第一种,新扩展的方法与原方法同名,但是还需要使用父类的实现。因为类别会覆盖原类的实现,无法访问到原来的方法。第二种,扩展类的属性,这个类别无法做到。以下两种情况最好使用类别,第一种,针对系统提供的一些类,例如:NSString,NSArray,NSNumber等类,系统本身不提倡使用继承去扩展方法,因为这些类内部实现对继承有所限制,所以最后使用类别来进行方法扩展。第二种,类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,对于大型而复杂的类,这有助于提高可维护性,并简化单个源文件的管理。

    frame和bounds的区别

    bounds是指这个view在它自己坐标系的坐标和大小 而frame指的是这个view在它superview的坐标系的坐标和大小区别主要在坐标系这一块。很明显一个是自己为原点的坐标系,一个是以屏幕为原点的坐标系

    几种持久化存储的区别:plist, NSUserDefaults,归档,数据库(sqlite和CoreData)

    如果是一些简单的key/value的键值对的存储可以用plist , NSUserDefaults 来存储就可以了。

    如果你的数据相对复杂,这时候你就需要用到关系型数据库了。如sqlite, 至于core data 本质上还是使用sqlite 来存储数据,它只是sqlite 的ORM  的一种实现 。而FMDB是第三方的为方便操作 sqlite 而封装 的库。

    响应者链

    iOS响应者链

    UITableView复用机制

    回头看之UITableView-(基本代理方法及复用原理) - 简书

    UITableVIew优化

    详细整理:UITableView优化技巧 - CocoaChina_让移动开发更简单

    内存管理

    www.douban.com/note/210192618/

    相关文章

      网友评论

        本文标题:iOS常见问题

        本文链接:https://www.haomeiwen.com/subject/kgirettx.html