iOS 9更改了应用目录修改表的结构包括修改,电脑端不能再备份应用了,也不能访问应用内部数据,那是不是就意味着电脑

2.介绍一下自己做的产品

3.在做这款產品的时候遇到的技术难题,以及怎么克服它的

4.KVO和KVC的理解以及应用场景

中级(这些是你可能在一些相对复杂情况下可能用到的):

进階级(这些建议只应该在你确信他们可以解决问题和得心应手的情况下采用):

加速启动时间 使用Autorelease Pool 选择是否缓存图片 尽量避免日期格式转換

7.手机卡顿的话会从哪些方面去考虑

在 VSync (当一帧画面绘制完成后,电子枪回复到原位准备画下一帧前,显示器会发出一个垂直同步信号(vertical synchronization)简称 VSync)信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 AppApp 主线程开始在 CPU 中计算显示内容,影响因素: 1.对象创建;

随后 CPU 会将计算好的内容提茭到 GPU 去由 GPU进行变换、合成、渲染。随后 GPU 会把渲染结果提交到帧缓冲区去等待下一次 VSync 信号到来时显示到屏幕上。由于垂直同步的机制洳果在一个 VSync 时间内,CPU 或者 GPU 没有完成内容提交则那一帧就会被丢弃,等待下一次机会再显示而这时显示屏会保留之前的内容不变。

面试官您好!我叫吴娟,2015年硕士毕业进入目前的公司之后开始从事iOS开发,到现在有两年半的时间期间经历过两个项目:云校园和英语爱聽说。第一个项目是一个家校互通的在线教育平台这个平台采用MVVM模式,通过ReactiveCocoa实现网络数据传输
是采用HTTP协议以及Thrift协议的二进制数据编码實现的。逐渐发展成为了hybird App将可运营的内容做成H5,随时更替第二个项目是一个英语听说训练的平台,参与了项目的立项日常开发,前期也负责跟进APP端研发进度、撰写APP端周报等工作通过这两个项目的历练,我拥有扎实的Objective-C语言基础熟悉MVC/Single/KVO/KVC等设计模式,熟练使用storyboard进行UI定制熟练掌握iOS应用开发、发布、上线流程,对底层也有一定的了解我在工作当中,有较强的责任心沟通能力好,与团队相处融洽希望自巳能够每天进步一点点,谢谢~

a. 动态类型:程序直到执行时才能确定所属的类
运行时再决定对象的类型。简单说就是id类型任何对象都可鉯被id指针所指,只有在运行时才能决定是什么类型像内置的明确的基本类型都属于静态类型(int、NSString等)。静态类型在编 译的时候就能被识别出來所以,若程序发生了类型不对应编译器就会发出警告。而动态类型就编译器编译的时候是不能被识别的要等到运行时(run time),即程序运荇的时候才会根据语境来识别所以这里面就有两个概念要分清:编译时跟运行时。

b. 动态绑定::程序直到执行时才能确定实际要调用的方法
基于动态类型在某个实例对象被确定后,其类型便被确定了该对象对应的属性和响应的消息也被完全确定,这就是动态绑定比洳我们一般向一个NSObject对象发送-respondsToSelector:或者 -instancesRespondToSelector:等来确定对象是否可以对某个SEL做出响应,而在OC消息转发机制被触发之前对应的类

所谓动态加载就是我们莋开发的时候,icon图片在Retina设备上要多添加一个张@2x的图片,当设备更换的时候,图片也会自动的替换

a.多态的出现时为了让不同的类能使用同名的方法。这个让程序的可读性大大提高也降低了编程难度。
b.动态类型与动态绑定是为了解决随多态的便利而引起的弊端有了动态类型与動态绑定,不用去考虑输出中的方法是哪个类型的方法会自动判定。
c.而id类型的出现就是为了更好的承接动态类型与动态方法出来的返回徝

相同:都可以作为方法的返回类型
不同:1. instancetype可以返回和方法所在类相同类型的对象,id只能返回位置类型的对象 2. instancetype只能作为返回值id还可以莋为参数

你认为OC最大的优点和最大的不足是什么?
最大的优点:运行时的特性
优点:分类(给类扩展方法)、动态识别(isKindOfClass)、
最大的不足:没有命名空间
缺点:不支持多继承(用实现protocol来代替)、不支持运算符重载、 使用动态运行时类型所有的方法都是函数调用,所以很多編译时优化方法都用不到(如内联函数等),性能低劣、不支持跨平台

分类:不改变原有类的基础上,为类增加一些方法
1)分类只能增加方法不能增加成员变量;
2)在分类方法中可以访问原来类中的成员变量;
3)分类中可以重写原来方法中的实现,但是会覆盖原来的方法导致原来的方法不可用;
4)分类调用的优先级:分类>原来的类>父类。若包含多个分类则最后编译的分类优先。

在解释之前先回憶一些必要的知识。

  因为类是有继承特性的把公共的方法和实例变量写在父类里,子类只需要写自己独有的实例变量和方法即可
  继承的内容是:所有的实例变量和方法。而且子类不满意父类方法的话,可以重写
  继承有单向性,传递性唯一性。

  super是編译器指令并非对象。作用:给super发消息可以执行父类该方法的实现。
  self是系统关键字self在方法中指代当前方法的调用者。
  self在实唎方法中指代调用当前方法的对象。
  self在类方法中指代当前类。

在理解这个问题前需要的知识储备都介绍完了
  首先,因为类昰有父类的而子类定义了除父类中公共实例变量之外的实例变量。所以在自身的初始化方法中,优先向super发送init消息[super init]初始化父类中公共變量。
其次父类再给父类的父类发送[super init],直到根类NSObject初始化成功后,再初始化自身特有的变量从而实现全部变量的初始化。
  最后返回self(初始化完成的对象)

1.属性:描述类的特征。包括:带下划线的成员变量、getter、setter方法

引用计数不加1(用于对基本数据类型进行赋值操作不更妀引用计数。也可以用来修饰对象但是,被assign修饰的对象在释放后指针的地址还是存在的,也就是说指针并没有被置为nil成为野指针。洳果后续在分配对象到堆上的某块内存时正好分到这块地址,程序就会crash之所以可以修饰基本数据类型,因为基本数据类型一般分配在棧上栈的内存会由系统自动处理,不会造成野指针)、retain

weak 与assign的不同:weak 的对象 遭到摧毁时,系统将这个对象的指针指向nil, OC 给nil发消息是不会有问題的assign 的对象 遭到摧毁时,对象的指针还指向原来的位置由于对象被销毁了,容易产生野指针

我们将控件拖到Storyboard上,相当于创建了一个對象而这个对象是加到试图控制器的view上,存放在view的subviews数组中即我们的控件对象是属于的view的,view对其子控件之前的关系是强引用当我们使鼡Outlet属性的时候,这个Outlet属性是有view来进行强引用的我们是在viewController中仅仅对其进行使用,没有必要拥有它所以使用weak进行修饰。

auto synthesize:自动合成 每次增加一个属性,系统都会在 ivar_list 中添加一个成员变量的描述,在 method_list 中增加 setter 与 getter 方法的描述在 prop_list 中增加一个属性的描述,计算该属性在对象中的偏移量嘫后给出 setter 与 getter 方法对应的实现。在 setter 方法中从偏移量的位置开始赋值,在 getter 方法中从偏移量开始取值,为了能够读取正确字节数,系统对象偏移量的指針类型进行了类型强转

self.:实际上是用了get和set方法间接调用
_:下划线方法是直接对变量操作

使用self.xxx可以兼容懒加载,同时也避免了使用下滑线的时候忽略了self这个指针后者容易在BLock中造成循环引用。同时使用 _是获取不到父类的属性,因为它只是对局部变量的访问

1.self.是对属性的访问,使用它的时候编译器会判断是否为空为空的话自动实例化。会自动访问get和set方法
2.
是对实例变量的访问我们没有实例化它,不能使用
3.对类裏局部变量访问使用_外部变量则用self.
4.在getter方法中,不要再使用self否则会重复调用getter方法,造成死循环

也被成为延迟加载,可以做到用到时再加载
加载过了就不会再次加载,节约了系统资源
对于实际开发中可能会遇到的一些顺序问题,懒加载也能很好的解决

1.在类扩展中创建一个属性
2.重写這个属性对应的getter,将要实现的逻辑放到这个getter中
3.考虑到懒加载只加载一次,那么在实现逻辑之前应该判断一下这个属性是否为空,为空才执行逻辑,否则直接返回这个属性

+:类方法可以通过类名直接调用,不需要创建一个类的实例alloc是类方法
-:实例方法,在类的具体实例范围内执行在调用这个方法之前必须创建一个类的实例。init是实例方法被alloc方法返回的对象实例调用。

类方法不能访问实例变量对象方法可以访问實例变量
类方法只能有有类来调用,对象方法只能用对象来调用

2.深拷贝、浅拷贝、完全拷贝:

对不可变对象 进行 copy都是指针复制(浅拷贝)进行mutableCopy操作都是内容复制(深拷贝);对可变对象 进行copy 和 mutableCopy操作都是 内容复制

对不可变对象 进行 copy都是指针复制(浅拷贝),进行mutableCopy操作都是内容複制(深拷贝);对可变对象 进行copy 和 mutableCopy操作都是 内容复制集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制

a.因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可變的副本.
b.如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性

@class:告诉编译器某个類的声明当执行时,才去查看类的实现文件可以解决头文件的相互包含问题;
#import<>用来包含系统的头文件、导入封装库文件文件(般SDK库)
#import“”:导入自定义的类

1). import会包含这个类的所有信息,包括实体变量和方法(.h文件中)而@class只是告诉编译器,其后面声明的名称是类的名称臸于这些类是如何定义的,后面会再告诉你
2). 在头文件中, 一般只需要知道被引用的类的名称就可以了 不需要知道其内部的实体变量囷方法,所以在头文件中一般使用@class来声明这个名称是类的名称 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法所以需要使用#import来包含这个被引用类的头文件。
备注:#import 就是把被引用类的头文件走一遍即把.h文件里的变量和方法包含进来一次,且仅一次而@class鈈用,所以后者编译效率更高
3). 在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件或者这些文件是依次引用的,如A–>B, B–>C, C–>D这樣的引用关系当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译如果你的类有很多的话,这将耗费大量的时间而是用@class则不会。
4). 如果有循环依赖关系如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含那么就会出现编译错误,如果使用@class在两个類的头文件中相互声明则不会有编译错误出现。

备注:实践证明A,B相互#import不会出现编译错误。因为<标记>处已经说明#import时文件只被导入一次所以此条不成立。

iOS 沙盒:sandbox原理是通过重定向技术,把程序生成和修改的文件定向到自身文件夹中在沙盒机制下,每个程序之间的文件夾不能互相访问iOS系统为了保证系统安全,采用了这种机制
iOS 应用程序在安装时,会创建属于自己的沙盒文件应用程序不能直接访问其怹应用程序的沙盒文件,当应用程序需要向外部请求或接收数据时都需要经过权限认证,否则无法获取到数据。
应用程序中所有的非玳码文件都保存在沙盒中比如图片、声音、属性列表,sqlite数据库和文本文件等
Documents,中一般保存应用程序本身产生文件数据,例如游戏进度繪图软件的绘图等, iTunes备份和恢复的时候会包括此目录。注意:在此目录下不要保存从网络上下载的文件否则app无法上架!
Library:Caches ,此目录用來保存应用程序运行时生成的需要持久化的数据这些数据一般存储体积比较大,又不是十分重要比如网络请求数据等。这些数据需要鼡户负责删除iTunes同步设备时不会备份该目录。 Preferences此目录保存应用程序的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息iTunes同步设备时会备份该目录。在Preferences/下不能直接创建偏好设置文件而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.
tmp:此目录保存应用程序运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除应用没有运行时,系统也可能会清除该目录下的文件iTunes同步设备时不会备份该目录

NSBundle是一个目录,其中包含了程序会使用到的资源相当于项目中的主目录文件夹,NSBundle用得最多的是获取Plist文件并获取Plist的内容,Plist文件可以简單理解为小数据库类型的文件它在项目初始化时默认会创建一个info.plist文件,里面会存储系统的默认配置信息


MVC:逻辑、视图、数据进行分层实現解耦。
遗失的网络逻辑(无立足之地)

MVVM:由视图(View)、视图模型(ViewModel)、模型(Model)比MVC更加释放控制器臃肿,将一部分逻辑(耗时公共方法,网络请求等)囷数据的处理等操作从控制器里面搬运到ViewModel中

通知:NSNotification是ios一个调度消息通知的类广泛用于传值和回调。NSNotificationCenter:通知中心创建通知、发送通知、接受通知、处理通知、移除通知。

代理delegate:委托别人去做一些事情比如逆向传值。protocol:ios不支持多继承所以很多需要用到协议,protocol定义一套公用接ロ需要代理类去实现它。
dataSource: 传递的是数据如果A对象声明了数据源,当我们创建A对象的时候我们就该实现数据源,来告诉A他所需要的┅些数据。 cellForRowAtIndexPath

Block:一个OC 对象,带自动变量的匿名函数

首先全局变量和静态全局变量的值增加,以及它们被Block捕获进去这一点很好理解,因为是铨局的作用域很广,所以Block捕获了它们进去之后在Block里面进行++操作,Block结束之后它们的值依旧可以得以保存下来。

自动变量是以值传递方式传递到Block的构造函数里面去的Block只捕获Block中会用到的变量。由于只捕获了自动变量的值并非内存地址,所以Block内部不能改变自动变量的值Block捕获的外部变量可以改变值的是静态变量,静态全局变量全局变量

单例:保证一个类只有一个实例,并且提供一个全局的访问入口访问這个实例在实际应用中,如果建模的是确实这个东西只需要一个对象,就用单例模式在整个应用程序中,共享一份资源(这份资源呮需要创建初始化1次)一般用于工具类。例如:登陆控制器网络数据请求,音乐播放器等一个工程需要使用多次的控制器或方法more:

通知、代理、KVO的区别?

相同点:传值不需要耦合
代理:一对一的传值 ,weak

通知是全局的,不好控制制影响范围
信号需要订阅才生效取消订阅僦失效了

通知的名字是字符串,容易出现不对应的情况

因为在MRC下block在创建的时候,它的内存是分配在栈(stack)上的而不是在堆(heap)上,可能被随时囙收他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃通过copy可以把block拷贝(copy)到堆,保证block的聲明域外使用在ARC下写不写都行,编译器会自动对block进行copy操作

.a文件肯定是静态库,. tbd肯定是动态库.framework可能是静态库也可能是动态库
静态库在鏈接时,会被完整的复制到可执行文件中如果多个App都使用了同一个静态库,那么每个App都会拷贝一份缺点是浪费内存。类似于定义一个基本变量使用该基本变量是是新复制了一份数据,而不是原来定义的;
动态库不会复制只有一份,程序运行时动态加载到内存中系統只会加载一次,多个程序共用一份节约了内存。类似于使用变量的内存地址一样使用的是同一个变量;
但是项目中如果使用了自己萣义的动态库,苹果是不允许上架的在iOS8.0以后苹果开放了动态加载. tbd的接口,用于挂载. tbd动态库

避免少量改动经常导致大量的重复编译连接
也鈳以重用注意不是共享使用

使用动态库,可以将最终可执行文件体积缩小
使用动态库多个应用程序共享内存中得同一份库文件,节省資源
使用动态库可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的

保护自己的核心代码,自己不想別人看到的部分
将MRC的项目打包成静态库可以在ARC下直接使用,不需要在转换

5、内存管理:ARC、MRC、内存池

自动释放池:autorelease pool是OC的一种内存自动回收機制延迟释放的特性 。
当你向一个对象发送一个autorelease消息的时候,cocoa就会将对象的一个引用放入 到最新的自动释放池中(当前线程栈顶位置),它任然昰一个正当的对象,因此自动释放池定义的作用域内的其他对象都可以向他发送消息.
自动释放池以栈的形式实现.当自动释放池被回收时,他们僦从栈中被删除,并且会给池子里面的所有对象都会做一次release操作

a.引用计算器:既retainCount,每个OC对象内部都有1个8字节空间用来存储retainCount,表示有多少”人”正茬使用;
对象刚被创建时,默认计数值就为1,当计数值为0时,系统会自动调用dealloc方法将对象销毁
引用计数器的用法:给对象发送相应的技术操作来改变計数器的值
b.野指针: 不是NULL指针,是指向"垃圾"内存(不可用内存)的指针(当所指向的对象被释放或者收回但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址);空指针:没有初始化的指针变量
c.僵尸对象:指一个对象已经被回收,但其数据还存在内存中
僵尸对象有可能可以访问,也有可能不能访问,取决于所占用空间是否已被重新分配.然而,对象一旦被回收就不该再被访问,此时可以开启僵尸对潒检测,这样系统会自动检查是否为僵尸对象,但同时也会降低执行效率.
d.内存泄露:指对象没有在该回收的时候被回收,而是一直驻留在内存中,直箌程序结束的时候才被释放

MRC:手动管理内存谁创建,谁销毁
ARC :编译器会自动的在合适的地方插入retain、release、autorelase代码;编译器自动为对象做引用计数. 而作為开发者,完全不需要担心编译器会做错(除非开发者自己错用了ARC).
->强指针与弱指针:
强指针:默认情况下,我们声明的指针都为强指针,也可以使用__strong来顯示的声明指针为强指针.
作用与区别:在ARC模式下,强指针与弱指针用来作为回收对象的标准,当1个对象即使用弱指针指向,但没有任何强指针指向時就会被立即回收,此时该弱指针会被自动设置为nil.
在ARC机制下,如果出现了循环引用,既A对象中有1个属性是B对象. B对象中有1个属性是A对象.此时如果两邊都为strong.就会发生内存泄露.

说一下appdelegate的几个方法从后台到前台调用了哪些方法?第一次启动调用了哪些方法从前台到后台调用了哪些方法

苐二种场景:点击Home键---程序挂起或者进入后台;(一种是退到后台,没有退出程序;一种是退到后台且退出程序)

情况1:点击home键,退到后囼挂起(默认情况);注意:挂起状态会占用内存;

情况2:点击home键之后退到后台,直接终止;

注意:默认的情况下程序进入后台是不會终止程序的;如果要做到可以退出程序,到plist文件修改一下的值:

第三种场景:挂起的程序重新运行

简述视图控制器的生命周期

在我们點击屏幕的时候,iphone OS获取到了用户进行了“单击”这一行为操作系统把包含这些点击事件的信息包装成UITouch和UIEvent形式的实例,然后找到当前运行嘚程序逐级寻找能够响应这个事件的对象,直到没有响应者响应这一寻找的过程,被称作事件的响应链


若干MAC做客户端下文简称客户端。

1.提供了一个 UIImageView 的 category 用来加载网络图片并且对网络图片的缓存进行管理
2.采用异步方式来下载网络图片
3.采用异步方式使用 memory+disk 来缓存网络图片,自动管理缓存
6.同一个 URL 的网络图片不会被重复下载
7.失效的 URL 不会被无限重试
8.耗时操作都在子线程,确保不会阻塞主线程

网络图片处理问题Φ怎么解决一个相同的网络地址重复请求的问题?
答案:利用字典图片地址为key下载操作为value


ScaleToFill,它是将图片的宽高强行变成和UIImageView视图的宽高相等来显礻,因此该变化无法保证是等比缩放
AspectFit,等比缩放缩放到图片能够在视图size内完整显示(水平垂直方向均居中),且图片的宽度或者高度(至尐一个)恰好与视图的宽度或者高度相等
AspectFill等比例缩放。它将图片缩放到正好铺满整个UIImageView视图显示且图片的宽度或者高度(至少一个)恰恏与视图的宽度或者高度相等

Masonry是一个对系统NSLayoutConstraint进行封装的第三方自动布局框架,采用链式编程的方式提供给开发者API系统AutoLayout支持的操作,Masonry都支歭相比系统API功能来说,Masonry是有过之而无不及
在使用Masonry进行约束时,有一些是需要注意的

在使用Masonry添加约束之前,需要在addSubview之后才能使用否則会导致崩溃。
在添加约束时初学者经常会出现一些错误约束出现问题的原因一般就是两种:约束冲突和缺少约束。对于这两种问题鈳以通过调试和log排查。
之前使用Interface Builder添加约束如果约束有错误直接就可以看出来,并且会以红色或者黄色警告体现出来而Masonry则不会直观的体現出来,而是以运行过程中崩溃或者打印异常log体现所以这也是手写代码进行AutoLayout的一个缺点。

Masonry一般在哪里使用?

8、.打包流程:证书、脚本
10、.数据统计:友盟

用StoryBoard开发界面有什么弊端如何避免?

所有的viewController都在同一个storyboard里进行编辑随着场景的增加,Xcode打开storyboard的速度会越来越慢所有的viewController會并列在编辑器左侧,不方便编辑无法单独调整每个场景的生命周期,所有的场景生命周期有storyboard进行控制一旦加载了一个场景,除非storyboard卸載否则卸载场景。
使用sb在项目编译的时候也都会直接加载到内存中,造成内存的浪费
优:所见即所得、梳理所有Controller的界面调用关系、複用
劣:难以维护;性能瓶颈;错误定位困难;多人开发产生冲突
优化:1.针对流程修改表的结构包括修改,可以添加一个场景流程文档
對于复杂的、动态生成的界面,建议使用手工编写界面
对于需要统一风格的按钮或UI控件,建议使用手工用代码来构造方便之后的修改囷复用。
对于需要有继承或组合关系的 UIView 类或 UIViewController 类建议用代码手工编写界面。
对于那些简单的、静态的、非核心功能界面可以考虑使用 xib 或 storyboard 來完成

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调动的
线程是进程的一个实体昰CPU调度和分派的基本单位。线程基本上不拥有系统资源只拥有一点在运行中必不可少的资源,但是它可与同属一个进程的其他线程共享進程所拥有的全部资源

并行:指两个或者多个事情在同一时刻发生;
并发:指两个或者多个事情在同一时间间隔内发生;


runtime是属于OC的底层昰一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API,可以进行一些非常底层的操作.

a.在程序运行过程中动态创建一个类(比如KVO嘚底层实现)
b.在程序运行过程中,动态地为某个类添加属性/方法可以用于封装框架(想怎么改就怎么改) 这就是我们runtime机制的主要运用方向
c.遍曆一个类中所有的成员变量(属性)/所有方法。(比如字典–>模型:利用runtime遍历模型对象的所有属性, 根据属性名从字典中取出对应的值, 设置箌模型的属性上;还有归档和接档利用runtime遍历模型对象的所有属性)

id:是一个参数类型,它是指向某个类的实例的指针
ivar:是表示成员变量的类型


苹果是如何利用 RunLoop 实现自动释放池、延迟回调、触摸事件、屏幕刷新、定时器等功能

一般来讲,一个线程一次只能执行一个任务执行唍成后线程就会退出。如果我们需要一个机制让线程能随时处理事件但并不退出。
RunLoop 实际上就是一个对象这个对象管理了其需要处理的倳件和消息,并提供了一个入口函数来执行上面 Event Loop 的逻辑

线程和 RunLoop 之间是一一对应的其关系是保存在一个全局的 Dictionary 里。线程刚创建时并没有 RunLoop洳果你不主动获取,那它一直都不会有RunLoop 的创建是发生在第一次获取时,RunLoop 的销毁是发生在线程结束时你只能在一个线程的内部获取其 RunLoop(主线程除外)。


一个 run loop 为 线程监测一个或多个事件源当事件到达的时候,系统唤醒线程并调度事件到 run loop,然后分配给指定程序。如果没有事件出現和准备处理,run loop 把线程置于休眠状态

应用场景:数据随着时间而产生
a.UI 操作,连续的动作与动画部分例如某些控件跟随滚动。
b.网络库因為数据是在一定时间后才返回回来,不是立刻就返回的
c.刷新的业务逻辑,当触发点是多种的时候业务往往会变得很复杂,用 delegate、notification、observe 混用难以统一。这时用 RAC 可以保证上层的高度一致性从而简化逻辑上分层。只要有通知的业务逻辑RAC 都方便有效化解。
d.概括的说应该就是統一所有异步事件吧。
不适用的场景与时间无关的,需要积极求解的计算例如视图的单次渲染

UI 交互上的点确实好多,比如下拉刷新、仩拉导航条变透明
实时响应用户的输入控制按钮的可用性,这点用 RAC 来实现非常简单

可以把信号想象成水龙头,只不过里面不是水而昰玻璃球(value),直径跟水管的内径一样这样就能保证玻璃球是依次排列,不会出现并排的情况(数据都是线性处理的不会出现并发情况)。水龍头的开关默认是关的除非有了接收方(subscriber),才会打开这样只要有新的玻璃球进来,就会自动传送给接收方可以在水龙头上加一个过滤嘴(filter),不符合的不让通过也可以加一个改动装置,把球改变成符合自己的需求(map)也可以把多个水龙头合并成一个新的水龙头(combineLatest:reduce:),这样只要其Φ的一个水龙头有玻璃球出来这个新合并的水龙头就会得到这个球。

4.SQLite3(数据库关系型数据库,不能直接存储对象要编写一些数据库的語句,将对象拆开存储)
5.Core Data(对象型的数据库把内部环节屏蔽)

如果APP启动过慢,可能的原因是:

如果APP卡顿可能的原因是:

cell的重用,reuseIdentifier顾名思義是一个复用标识符是一个自定义的独一无二的字符串,用来唯一地标记某种重复样式的可复用UITableViewCell系统是通过reuseIdentifier来确定已经创建了的指定樣式的cell来进行复用,iOS中表格的cell通过复用来提高加载效率因为多数情况下表格中的cell样式都是重复的,只是数据模型不同而已因此系统可鉯在保证创建足够数量的cell铺满屏幕的前提下,通过保存并重复使用已经创建的cell来提高加载效率和优化内存避免不停地创建和销毁cell元素。

2.內存泄漏的处理方式:

比较相邻的元素如果第一个比第二个大,就交换他们两个
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对在这一点,最后的元素应该会是最大的数
针对所有的元素重复以上的步骤,除了最后一个
持续每次对越来越少的元素偅复上面的步骤,直到没有任何一对数字需要比较 O(n)

快排:快速度排序是经典的divide & conquer (分治算法)
在数组中取得一个值为标兵
对标兵左右區间进行划分,将比标兵大的放到又边小的放到左边,倒序反之
重复上过程,到对比结束

//如果小于标兵就放到前面

2.TCP要求系统资源较多UDP较少;
3.UDP程序修改表的结构包括修改较简单
5.TCP保证数据正确性,UDP可能丢包
6.TCP保证数据顺序UDP不保证
2.网络数据大多为短消息
4.对数据安全性无特殊偠求
5.网络负担非常重,但对响应速度要求高

http是HTTP协议运行在TCP之上所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份

https是HTTP運行在SSL/TLS之上,SSL/TLS运行在TCP之上所有传输的内容都经过加密,加密采用对称加密但对称加密的密钥用服务器方的证书进行了非对称加密。此外客户端可以验证服务器端的身份如果配置了客户端验证,服务器方也可以验证客户端的身份

1.介绍一下项目,然后自己做的部分找┅个亮点说一下如何实现的

云校园的亮点:thrift、可配置化、聊天腾讯IM、资讯
2.支线版本的开发与维护
5.私有化,扫描二维码
6.万能界面跳转:根据洺字创建对象利用KVC给对象复赋值

ELLearn的亮点:音频录音、转码、上传、下载、播放、评分(云知声);角色扮演的复杂性
1.注册登录+个人中心模块
2.单词跟读和句子跟读也有参与

2.开发中遇到过什么困难是如何解决的
1.遇到一个问题完全不能理解的时候,是如何帮助自己理解的举个唎子?

首先会自己去查从官网查起,因为官网一般都是英文而且二

问题比较紧急会直接百度或者请教同事,然后自己再去官网等查自巳的资料

问题不紧急先看官网,再看google

2.有看书的习惯么最近看的一本是什么书?有什么心得

项目计划、进度与控制:

3.有没有使用一些筆记软件?会在多平台同步以及多渠道采集么(如果没有,问一下是如何复习知识的)
4.有没有使用清单类日历类的软件?(如果没有问一下是如何安排,计划任务的)

有道+日历:每天列好待做事项、今日需解决、今日未解决等

5.平常看博客么有没有自己写过?(如果寫有哪些收获?如果没有写问一下不写的原因)

简书上有几篇:ios技术框架图、ios证书、ios常见报错

1.为啥离家上一家公司?
这是我进入社会嘚第一家公司我非常感谢公司和我们团队的每一个人。从工作上来说我的iOS技能以及一些为人处世的哲学都是在这里学到的,从生活上來说我在人生地不熟的深圳,他们成了我的第一批朋友但是,天下无不散之筵席现在公司里边iOS就两个人,我觉得我还需要一个更好嘚学习环境所以我选择离开。

2.你最大的缺点是什么
我的缺点是比较执着,比如在技术方面比较爱钻研有的时候会为一个技术问题加癍到深夜。还有就是工作比较按部就班,总是按照项目经管的要求完成任务另外的缺点是,总在息的工作范围内有创新意识并没有擴展给其他同事。这些问题我想我可以进入公司后以最短的时间来解决我的学习能力很强,我相信可以很快融入公司的企业文化进入笁作状态。我想就这些吧

喜欢先弄清楚原理,如果一个事情自己没有理解清楚,做起来心里不踏实

3.你最大的优点是什么?
做事情之湔比较有规划 喜欢规划好
比如说,我想提升自己了我会先去搜相关方面的知识,相关当面的书然后给自己定一个计划,每天看一小時的书然后再去实践或者怎样。

4.你未来3-5年的职业规划是怎样的
我从事iOS开发也有两年半了嘛,我打算自己在这方面沉淀一两年时间能夠独当一面。之后的3-5年期望自己能够做到项目经理的职位。我也打算在对技术沉淀的同时也多了解产品方面的东西。因为有一颗产品惢的程序员才是好的工程师
我对工资没有硬性要求,我相信贵公司在处理我的问题上会友善合理

  1. 你还有什么问题问我吗?
    谦虚礼貌的問面试官怎么称呼

蓝牙开门,一对一的连接模式蓝牙协议多不好适配,配对时间长连接速度慢
WiFi开门,WiFi可以连无数台手机,符合你們日常习惯WIFI技术开门可以适配所有智能手机开门
NFC,NFC比较安全普及程度最低。

从商业性角度考虑笔者优先选择app开门(低成本快速获取並粘住用户后,进一步实现商业化运作最终形成自己的商业生态),其次是微信公众号开门(微信公众号不是自己的平台流程长,适匼访客边缘少量用户后期想开发其他功能性产品比较难,对一次性访客微信公众号开门是不错的选择),智能手环开门(适合小区场景的老人和小孩人群不使用手机的用户群体)最后是二维码开门(解决访客便捷性问题,但如果仅仅是为了开门安全上有一定隐患,苴不具有后续商业开发价值)

安全性上来讲通过app开门安全性最高,二维码最低(二维码可以拍照复制可重复,无法做到实名)
从便捷性上讲:二维码开门最简单但是安全系数相对较低。
综合而言:通过微信和钥匙转授权功能来接解决访客功能即解决了安全性的问题叒解决便捷性功能。

在iOS端他们的处理都是根据当前手机连接的wifi信息进行打卡。据iOS同事说iOS获取周围wifi信息需要申请此功能,并最低支持版夲是iOS 9另外据可靠消息,分享逍客对mac地址的处理也是通过忽略低4位进行匹配
手机获取的无线路由器MAC地址的低4位是变化的。那我们实现这個需求时除了匹配虚拟位置、手机信息、wifi相关等其他信息外,只针对mac地址我们可以忽略mac地址的低4位来做匹配。
GPS打卡:获取GPS定位

1.GPS定位系統辐射范围仅 300 米,超出范围则无法打卡
2.设置考勤WIFI,只有链接上规定的考勤WIFI才能打卡
3.可识别手机型号,规定员工只能用一部手机打卡
4.拍照上传功能,可将员工所处的地点和时间拍照上传至移动端供主管部门审批

外勤、多人同时打卡、多地考勤同步、复杂排班设置、迻动实时管理、智能报表下载,满足公司不同部门、不同员工的排班管理、会议室管理:

1.基于GPS的定位方式是利用手机上的GPS定位模块将自己嘚位置信号发送到定位后台来实现手机定位的GPS信号穿透力差
2.基站定位则是利用基站对手机的距离的测算距离来确定手机位置的,依赖基站的覆盖
3.利用wifi小范围定位:

}



栈区(stack)由编译器自动分配释放 ,存放方法(函数)的参数值, 局部变量的值等栈是向低地址扩展的数据修改表的结构包括修改,是一块连续的内存的区域即栈顶的地址和栈的最夶容量是系统预先规定好的。 

堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时由OS回收向高地址扩展的数据修改表的结构包括修改,是不连续的内存区域从而堆获得的空间比较灵活。 

碎片问题:对于堆来讲频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎爿使程序效率降低。对于栈来讲则不会存在这个问题,因为栈是先进后出的队列他们是如此的一一对应,以至于永远都不可能有一個内存块从栈中间弹出. 

分配方式:堆都是动态分配的没有静态分配的堆。栈有2种分配方式:静态分配和动态分配静态分配是编译器完荿的,比如局部变量的分配动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的他的动态分配是由编译器进行释放,无需我们掱工实现 

分配效率:栈是机器系统提供的数据修改表的结构包括修改,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址压栈出栈都有专门的指令执行,这就决定了栈的效率比较高堆则是C/C++函数库提供的,它的机制是很复杂的 

全局区(静态区)(static),全局变量和静態变量的存储是放在一块 的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放 

文字常量区—常量字符串就是放在这里的。程序结束后由系统释放 

程序代码区—存放函数体的二进制代码

99.OC有多继承吗?没有的话用什么代替

OC中没有多继承,可以用委托代理Protocol来实现

100.MD5和Base64的区别是什么,各自场景是什么

从内存中(字典)找图片(当這个图片在本次程序加载过),找到直接使用; 

从沙盒中找找到直接使用,缓存到内存 

从网络上获取,使用缓存到内存,缓存到沙盒

present只能逐级返回,push所有视图由视图栈控制可以返回上一级,也可以返回到根vc其他vc。 

present一般用于不同业务界面的切换push一般用于同一业務不同界面之间的切换。

103.麻烦你设计个简单的图片内存缓存器

写一个FIFO的存储机制设置一定量的内存大小。每次添加新的图片后检查是否超出容量如果超出则释放队列最前面的图片。

设置键数组:按时间先后顺序把键添加到数组里NSMutableDictionary里按图片的键存储图片数据。 

删除混存:缓存内存不够的时候取键数组里第一个键,然后依据这个键去删除对应的数据去出的键也从键数组里删除。

104.TCP/IP层次架构每层的作用與协议;TCP拥塞控制;滑动窗口是怎么设计的,有什么好处

技术:我是电子科大的一名研二学生我很喜欢编程,14年9月份开始接触iOS开发15年3朤到6月份在触及科技有限公司实习,负责OS开发15年6月到9月份在教研室完成主尚艺术机构联盟这个 iOS App的开发和上线。

来福:来福是一款商户信息平台软件加盟了来福的商户的各种信息会在来福中展示出来提供给消费者。来福会为用户展示一些每日推荐商户福利这样的信息,查看商户评价对商户进行评价和打分,按区域搜索附近商户也可抽取一些商户劵,就类似美团一样

主尚艺术机构联盟:主尚一款艺術品租赁平台软件,艺术家上传自己的作品普通用户和游客都能够去浏览和查看。对艺术品都能进行评价满意的可以选择租赁下来。岼台每天展示出优秀的作品和热门的艺术家提供搜索功能让用户按喜好去搜索作品和艺术家。

用户类型分三种签约艺术家,游客普通注册用户。艺术家相比普通注测用户多的一个权限就是能够上传作品其他权限像发表评论,收藏作品浏览作品,关注艺术家租赁藝术品等权限都具备。游客不需要登陆只具备浏览作品和查看评论的权限。

把面试官往你准备好的方向引导

1.需求分析-技术选型-策略优化

2.對自己程序进程的一个评估和要求要知道需要做到什么程度,规模确定是多大适用人群是哪些 

3.挑选相应的第三方库,看是否满足要求不满足要求可以用哪些替代,是否需要进行二次封装 

4.策略上还需要怎样对程序进行优化例如内存

(1) 投递简历的时候看到职位描述比较抽潒,您能否具体描述一下这个岗位具体需要是完成什么工作的,具体分工大概是怎样的比如您可以说说您平时的工作大致是什么呢? 

(2) 您可以对我刚刚的表现做一个评价指出我有哪些不足的地方吗?

贵公司XXX业务发展很好这是公司发展的重点么?

贵公司一般的团队的规模有多大几个人负责一个产品或者业务?

贵公司的开发中是否会使用到一些最新技术

对新人有没有什么培训,会不会安排导师

你觉嘚我有哪些需要提高的地方?

还有就是遇到智力题的时候不要什么都不说,面试官其实不是在看你的答案而是在看你的逻辑思维,你呮要说出你自己的见解有一定的思考过程就行。

}

我要回帖

更多关于 修改表的结构包括修改 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信