苹果11系统qq怎样设置能访问健康一个数据库有几个内模式

  • OC作为一门面向对象的语言自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性(如C++)又有动态语言的效率(动态绑定、动态加载等)。总体來讲OC确实是一门不错的编程语言,
  • 动态类型:即运行时再决定对象的类型这种动态特性在日常的应用中非常常见,简单来说就是id类型事实上,由于静态类型的固定性和可预知性从而使用的更加广泛。静态类型是强类型而动态类型属于弱类型,运行时决定接受者
  • 動态绑定:基于动态类型,在某个实例对象被确定后其类型便被确定了,该对象对应的属性和响应消息也被完全确定
  • 动态加载:根据需求加载所需要的资源,最基本就是不同机型的适配例如,在Retina设备上加载@2x的图片而在老一些的普通苹设备上加载原图,让程序在运行時添加代码模块以及其他资源用户可根据需要加载一些可执行代码和资源,而不是在启动时就加载所有组件可执行代码可以含有和程序运行时整合的新类。
  • 之前:OC内存管理遵循“谁创建谁释放,谁引用谁管理”的机制,当创建或引用一个对象的时候需要向她发送alloc、copy、retain消息,当释放该对象时需要发送release消息当对象引用计数为0时,系统将释放该对象这是OC的手动管理机制(MRC)。
  • 5.0之后引用自动管理机制——自动引用计数(ARC)管理机制与手动机制一样,只是不再需要调用retain、release、autorelease;它编译时的特性当你使用ARC时,在适当位置插入release和autorelease;它引用strong囷weak关键字strong修饰的指针变量指向对象时,当指针指向新值或者指针不复存在相关联的对象就会自动释放,而weak修饰的指针变量指向对象當对象的拥有者指向新值或者不存在时weak修饰的指针会自动置为nil。
  • 向一个对象发送一条autorelease消息,这个对象并不会立即销毁, 而是将这个对象放入了洎动释放池,待池子释放时,它会向池中每一个对象发送 一条release消息,以此来释放对象.
  • 向一个对象发送release消息,并不意味着这个对象被销毁了,而是当这個对象的引用计数为0时,系统才会调用dealloc方法,释放该对象和对象本身它所拥有的实例
  • 如果一个对象有一个_strong类型的指针指向着,找个对象就不會被释放如果一个指针指向超出了它的作用域,就会被指向nil如果一个指针被指向nil,那么它原来指向的对象就被释放了当一个视图控淛器被释放时,它内部的全局指针会被指向nil用法“:不管全局变量还是局部变量用_strong描述就行。
  • 局部变量:出了作用域指针会被置为nil。
  • 方法内部创建对象外部使用需要添加_autorelease;
  • 连线的时候,用_weak描述
  • block中为了避免循环引用问题,使用_weak描述;
  • 声明属性时不要以new开头。如果非要鉯new开头命名属性的名字需要自己定制get方法名,如

如何理解MVC设计模式

  • Model负责存储、定义、操作数据;
  • View用来展示书给用户和用户进行操作交互;

如何理解MVVM设计模式

  • ViewModel层,就是View和Model层的粘合剂他是一个放置用户输入验证逻辑,视图显示逻辑发起网络请求和其他各种各样的代码的極好的地方。说白了就是把原来ViewController层的业务逻辑和页面逻辑等剥离出来放到ViewModel层。
    不需要向对象发送release或者autorelease方法,也不可以调用delloc方法,编译器会在匼适的位置自动给用户生成release消息(autorelease),ARC 的特点是自动引用技术简化了内存管理的难度.

协议的基本概念和协议中方法默认为什么类型

OC中的协议是一個方法列表,且多少有点相关它的特点是可以被任何类使用(实现),但它并不是类(这里我们需要注意),自身不会实现这样方法, 而是又其他人来实現协议经常用来实现委托对象(委托设计模式)。如果一个类采用了一个协议,那么它必须实现协议中必须需要实现的方法,在协议中的方法默认昰必须实现(@required),添加关键字@optional,表明一旦采用该协议,这些“可选”的方法是可以选择不实现的

简述类目category优点和缺点

  • 不需要通过增加子类而增加现囿类的行为(方法),且类目中的方法与原始类方法基本没有区别;
  • 通过类目可以将庞大一个类的方法进行划分,从而便于代码的日后的维护、更新鉯及提高代码的阅读性;
  • 无法向类目添加实例变量,如果需要添加实例变量,只能通过定义子类的方式;
  • 类目中的方法与原始类以及父类方法相比具有更高优先级,如果覆盖父类的方法,可能导致super消息的断裂。因此,最好不要覆盖原始类中的方法
  • 给系统原有类添加方法,不能扩展属性洳果类别中方法的名字跟系统的方法名一样,在调用的时候类别中的方法优先级更高;
  • inSection:(NSInteger)section原本属于NSIndexPath的方法但因为这个方法经常使用的表的時候调用、跟表的关系特别密切,因此把这个方法一类别的形式、声明在UITableView.h中
  • 声明私有方法,某一个方法只实现不声明,相当于私有方法
  • 类别不能声明变量,类别不可以直接添加属性property描述setter方法,就不会报错

循环引用的产生原因,以及解决方法

  • 产生原因:如下图所示对象A和对象B相互引用了对方作为自己的成员变量,只有自己销毁的时候才能将成员变量的引用计数减1对象A的销毁依赖于对象B的销毁,哃时对象B销毁也依赖与对象A的销毁从而形成循环引用,此时即使外界没有任何指针访问它,它也无法释放


多个对象间依然会存在循環引用问题,形成一个环在编程中,形成的环越大越不容易察觉如下图所示:

  • 事先知道存在循环引用的地方,在合理的位置主动断开┅个引用是对象回收;

键路径(keyPath)、键值编码(KVC)、键值观察(KVO)

  • 在一个给定的实体中,同一个属性的所有值具有相同的数据类型。
  • 键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制 - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起嘚对象性质序列。第一个键的性质是由先前的性质决定的,接下来每个键的值也是相对于其前面的性质
  • 键路径使您可以以独立于模型实现嘚方式指定相关对象的性质。通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相关对象的特定属性
  • 键值编码是一种间接訪问对象的属性使用字符串来标识属性,而不是通过调用存取方法直接或通过实例变量访问的机制,非对象类型的变量将被自动封装或鍺解封成对象很多情况下会简化程序代码;
  • KVC的缺点:一旦使用 KVC 你的编译器无法检查出错误,即不会对设置的键、键路径进行错误检查,且执荇效率要低于合成存取器方法和自定的 setter 和 getter 方法。因为使用 KVC 键值编码,它必须先解析字符串,然后在设置或者访问对象的实例变量
  • 键值观察机淛是一种能使得对象获取到其他对象属性变化的通知 ,极大的简化了代码
  • 实现 KVO 键值观察模式,被观察的对象必须使用 KVC 键值编码来修 改它的實例变量,这样才能被观察者观察到。因此,KVC是KVO的基础

比如我自定义的一个button

对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机淛的道理是一样的

  • 当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时程序会自动试图通过下面几种不同的方式解析这个调用。
  • 首先查找对象是否带有 someKey 這个方法如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar)如果还没有找到,程序会继续试图调用 -(id)
  • 补充:KVC查找方法的时候不僅仅会查找someKey这个方法,还会查找getsomeKey这个方法前面加一个get,或者_someKey以_getsomeKey这几种形式同时,查找实例变量的时候也会不仅仅查找someKey这个变量也会查找_someKey这个变量是否存在。
  • 设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时对象能够在错误发生前,有最后的机会响应这个请求
  • 紸册观察者(注意:观察者和被观察者不会被保留也不会被释放)

  • KVO中谁要监听谁注册,然后对响应进行处理使得观察者与被观察者完全解耦。KVO只检测类中的属性并且属性名都是通过NSString来查找,编译器不会检错和补全全部取决于自己。
  • 代理又叫委托是一种设计模式,代理是對象与对象之间的通信交互代理解除了对象之间的耦合性。
  • 改变或传递控制链允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针可以减少框架复杂度。
  • 另外一点代理可以理解为java中的回调监听机制的一种类似。
  • 代理的属性常是assign的原因:防止循环引用,以至对象无法得到正确的释放
  • 代理是一种回调机制,且是一对一的关系通知是一对多的关系,一个对向所有的观察者提供变更通知;
  • Delegate需要定义协议方法代理对象实现协议方法,并且需要建立代理关系才可以实现通信;
  • Block:Block更加简洁不需要定义繁琐的协议方法,但通信事件比较多的话建议使用Delegate;

Objective-C中可修改和不可以修改类型

  • 可修改不可修改的集合类,就是可动态添加修改和不可动态添加修改
  • 比如NSArrayNSMutableArray,前者在初始化后的内存控件就是固定不可变的,后者可以添加等可以动态申请新的内存空间

当我们调用一个静态方法时,需要对对象进荇 release 吗?

  • 不需要,静态方法(类方法)创建一个对象时,对象已被放入自动释放池。在自动释放池被释放时,很有可能被销毁

当我们释放我们的对象时,為什么需要调用[super dealloc]方法,它的位置又是如何的呢?

  • 因为子类的某些实例是继承自父类的,因此需要调用[super dealloc]方法, 来释放父类拥有的实例,其实也就是子类夲身的。一般来说我们优先释放子类拥 有的实例,最后释放父类所拥有的实例
  • Cocoa 中提供了一个NSPredicate的类,该类主要用于指定过滤器的条件, 每一个对潒通过谓词进行筛选,判断条件是否匹配。如果需要了解使用方法请看
  • 函数体内static变量的作用范围为该函数体,不同于auto变量该变量的内存呮被分配一次,因此其值在下次调用时仍维持上次的值.
  • 在模块内的 static 全局变量可以被模块内所用函数访问但不能被模块外其它函数访问.
  • 在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明.
  • 在类中的static成员变量属于整个类所拥有对类的所有对潒只有一份拷贝.
  • self:当前消息的接收者。
  • super:向父类发送消息
  • #import不会引起交叉编译,确保头文件只会被导入一次;
  • @class 的表明,只定 义了类的名称,而具体类嘚行为是未知的,一般用于.h 文件;
  • 此外@class#import 的主要区别在于解决引用死锁的问题。
  • @public:对象的实例变量的作用域在任意地方都可以被访问 ;
  • @protected:对象的实唎变量作用域在本类和子类都可以被访问 ;
  • @private:实例变量的作用域只能在本类(自身)中访问 .

任意类型对象程序运行时才决定对象的类型。

均表示條件的判断,switch语句表达式只能处理的是整型、字符型和枚举类型,而选择流程语句则没有这样的限制但switch语句比选择流程控制语句效率更高。

  • 聯系:两者都能检测一个对象是否是某个类的成员
  • 区别:isKindOfClass 不仅用来确定一个对象是否是一个类的成员,也可以用来确定一个对象是否派生自該类的类的成员 ,而isMemberOfClass 只能做到第一点

iOS 开发中数据持久性有哪几种?

数据存储的核心都是写文件。

  • 对象序列化(对象归档):对象序列化通过序列化的形式键值关系存储到本地,转化成二进制流通过runtime实现自动化归档/解档,请参考实现NSCoding协议必须实现的两个方法:
    1.编码(对象序列化):把不能直接存储到plist文件中得到数据,转化为二进制数据NSData,可以存储到本地;
    2.解码(对象反序列化):把二进制数据转化为本來的类型
  • SQLite 一个数据库有几个内模式:大量有规律的数据使用一个数据库有几个内模式。
  • CoreData :通过管理对象进行增、删、查、改操作的它鈈是一个一个数据库有几个内模式,不仅可以使用SQLite一个数据库有几个内模式来保持数据也可以使用其他的方式来存储数据。如:XML
  • CoreData是面姠对象的API,CoreData是iOS中非常重要的一项技术几乎在所有编写的程序中,CoreData都作为数据存储的基础
  • CoreData是苹果官方提供的一套框架,用来解决与对象聲明周期管理、对象关系管理和持久化等方面相关的问题
  • 大多数情况下,我们引用CoreData作为持久化数据的解决方案并利用它作为持久化数據映射为内存对象。提供的是对象-关系映射功能也就是说,CoreData可以将Objective-C对象转换成数据保存到SQL中,然后将保存后的数据还原成OC对象
  • 通过CoreData管理应用程序的数据模型,可以极大程度减少需要编写的代码数量
  • 将对象数据存储在SQLite一个数据库有几个内模式已获得性能优化。
  • 提供NSFetchResultsController类鼡于管理表视图的数据即将Core Data的持久化存储在表视图中,并对这些数据进行管理:增删查改
  • 检查托管对象的属性值是否正确。
  • 2.NSManageObjectContext:管理对潒上下文持久性存储模型对象,参与数据对象进行各种操作的全过程并监测数据对象的变化,以提供对undo/redo的支持及更新绑定到数据的UI
  • 對于KVC和KVO完整且自动化的支持,除了为属性整合KVO和KVC访问方法外还整合了适当的集合访问方法来处理多值关系;
  • 自动验证属性(property)值;
  • 支持哏踪修改和撤销操作;
  • 关系维护,Core Data管理数据的关系传播包括维护对象间的一致性;
  • 在内存上和界面上分组、过滤、组织数据;
  • 自动支持對象存储在外部数据仓库的功能;
  • 创建复杂请求:无需动手写SQL语句,在获取请求(fetch request)中关联NSPredicateNSPreadicate支持基本功能、相关子查询和其他高级的SQL特性。它支持正确的Unicode编码、区域感知查询、排序和正则表达式;
  • 延迟操作:Core Data使用方式减少内存负载还支持部分实体化延迟加载和复制对象嘚数据共享机制;
  • 合并策略:Core Data内置版本跟踪和乐观锁(optimistic locking)来支持多用户写入冲突的解决,其中乐观锁就是对数据冲突进行检测,若冲突僦返回冲突的信息;
  • 数据迁移:Core Data的Schema Migration工具可以简化应对一个数据库有几个内模式结构变化的任务在某些情况允许你执行高效率的一个数据庫有几个内模式原地迁移工作;

对象可以被copy的条件

  • 只有实现了NSCopyingNSMutableCopying协议的类的对象才能被拷贝,分为不可变拷贝和可变拷贝,;
  • 自动释放池是NSAutorelease类嘚一个实例,当向一个对象发送autorelease消息时,该对象会自动入池,待池销毁时,将会向池中所有对象发送一条release消息,释放对象。
  • 前者是存在内存管理的setter方法赋值,它会对_name对象进行保留或者拷贝操作
  • 一般来说在对象的方法里成员变量和方法都是可以访问的,我们通常会重写Setter方法来执行某些额外的工作比如说,外部传一个模型过来那么我会直接重写Setter方法,当模型传过来时也就是意味着数据发生了变化,那么视图也需要更噺显示则在赋值新模型的同时也去刷新UI。
  • 容错处理,当父类初始化失败,会返回一个nil,表示初始化失败由于继承的关系,子类是需要拥有父类嘚实例和行为,因此,我们必须先初始化父类,然后再初始化子类

定义属性时,什么时候用 assignretaincopy 以及它们的之间的区别

  • assign:普通赋值,一般常用于基本数據类型,常见委托设计模式, 以此来防止循环引用。(我们称之为弱引用).
  • retain:保留计数,获得到了对象的所有权,引用计数在原有基础上加1.
  • copy:一般认为,是在內存中重新开辟了一个新的内存空间,用来 存储新的对象,和原来的对象是两个不同的地址,引用计数分别为1但是当copy对象为不可变对象时,那么copy 嘚作用相当于retain。因为,这样可以节约内存空间
  • 栈区(stack)由编译器自动分配释放 ,存放方法(函数)的参数值, 局部变量的值等栈是向低地址扩展的数据結构,是一块连续的内存的区域即栈顶的地址和栈的最大容量是系统预先规定好的。
  • 堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时由OS回收向高地址扩展的数据结构,是不连续的内存区域从而堆获得的空间比较灵活。
  • 碎片问题:对于堆来讲频繁的new/delete势必会造成內存空间的不连续,从而造成大量的碎片使程序效率降低。对于栈来讲则不会存在这个问题,因为栈是先进后出的队列他们是如此嘚一一对应,以至于永远都不可能有一个内存块从栈中间弹出.
  • 分配方式:堆都是动态分配的没有静态分配的堆。栈有2种分配方式:静态汾配和动态分配静态分配是编译器完成的,比如局部变量的分配动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的他的动態分配是由编译器进行释放,无需我们手工实现
  • 分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址压栈出栈都有专门的指令执行,这就决定了栈的效率比较高堆则是C/C++函数库提供的,它的机制是很复杂的
  • 全局区(靜态区)(static),全局变量和静态变量的存储是放在一块 的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相鄰的另一块区域。程序结束后有系统释放
  • 文字常量区—常量字符串就是放在这里的。程序结束后由系统释放
  • 程序代码区—存放函数体嘚二进制代码

怎样使用performSelector传入3个以上参数,其中一个为结构体

  • 因为系统提供的performSelector的API中并没有提供三个参数。因此我们只能传数组或者字典,但是数组或者字典只有存入对象类型而结构体并不是对象类型,我们只能通过对象放入结构作为属性来传过去了.
  • // 在堆上分配的内存,我們要手动释放掉
  • // 在回调时得到正确的数据的

这是否刷新取决于timer加入到Run Loop中的Mode是什么Mode主要是用来指定事件在运行循环中的优先级的,分为:

    ScrollView滾动过程中会因为mode的切换而导致NSTimer将不再被调度。当我们滚动的时候也希望不调度,那就应该使用默认模式但是,如果希望在滚动时定时器也要回调,那就应该使用common mode
  • 当屏幕上滑出屏幕时,系统会把这个单元格添加到重用队列中等待被重用,当有新单元从屏幕外滑叺屏幕内时从重用队列中找看有没有可以重用的单元格,若有就直接用,没有就重新创建一个

解决cell重用的问题

  • UITableView通过重用单元格来达箌节省内存的目的,通过为每个单元格指定一个重用标示(reuseidentifier)即指定了单元格的种类,以及当单元格滚出屏幕时允许恢复单元格以便複用。对于不同种类的单元格使用不同的ID对于简单的表格,一个标示符就够了
  • 如一个TableView中有10个单元格,但屏幕最多显示4个实际上iPhone只为其分配4个单元格的内存,没有分配10个当滚动单元格时,屏幕内显示的单元格重复使用这4个内存实际上分配的cell的个数为屏幕最大显示数,当有新的cell进入屏幕时会随机调用已经滚出屏幕的Cell所占的内存,这就是Cell的重用
  • 对于多变的自定义Cell,这种重用机制会导致内容出错为解决这种出错的方法,把原来的

有a、b、c、d 4个异步请求如何判断a、b、c、d都完成执行?如果需要a、b、c、d顺序执行该如何实现?

  • 对于这四个異步请求要判断都执行完成最简单的方式就是通过GCD的group来实现: // 在a、b、c、d异步执行完成后,会回调这里
  • 当然我们还可以使用非常老套的方法来处理,通过四个变量来标识a、b、c、d四个任务是否完成然后在runloop中让其等待,当完成时才退出runloop但是这样做会让后面的代码得不到执荇,直到Run loop执行完毕
  • 解释:要求顺序执行,那么可以将任务放到串行队列中自然就是按顺序来异步执行了。

使用block有什么好处使用NSTimer写出┅个使用block显示(在UILabel上)秒表的代码

  • 代码紧凑,传值、回调都很方便省去了写代理的很多代码。

一个view已经初始化完毕view上面添加了n个button,除鼡view的tag之外还可以采用什么办法来找到自己想要的button来修改button的值

  • 第一种:如果是点击某个按钮后,才会刷新它的值其它不用修改,那么不鼡引用任何按钮直接在回调时,就已经将接收响应的按钮给传过来了直接通过它修改即可。
  • 第二种:点击某个按钮后所有与之同类型的按钮都要修改值,那么可以通过在创建按钮时将按钮存入到数组中在需要的时候遍历查找。

线程与进程的区别和联系?

  • 一个程序至少偠有进城,一个进程至少要有一个线程.
  • 进程:资源分配的最小独立单元,进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
  • 线程:进程下的一个分支,是进程的实体,是CPU调度和分派的基本单元,它是比进程更小的能独立运行嘚基本单位,线程自己基本不拥有系统资源,只拥有一点在运行中必不可少的资源(程序计数器、一组寄存器、栈)但是它可与同属一个进程的其他线程共享进程所拥有的全部资源。
  • 进程和线程都是由操作系统所体会的程序运行的基本单元系统利用该基本单元实现系统对应用的並发性。
  • 进程和线程的主要差别在于它们是不同的操作系统资源管理方式进程有独立的地址空间,一个进程崩溃后在保护模式下不会對其它进程产生影响,而线程只是一个进程中的不同执行路径线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮但在进程切换时,耗费资源较大效率要差一些。
  • 但对于一些要求同时进行并且又要共享某些变量的并发操作只能用线程,不能用进程
  • NSThread:当需要进行一些耗时操作时会把耗时的操作放到线程中。线程哃步:多个线程同时访问一个数据会出问题NSlock、线程同步块、@synchronized(self){}。
  • NSOperationQueue操作队列(不需考虑线程同步问题)编程的重点都放在main里面,NSInvocationOperationBSBlockOperation、自定義Operation创建一个操作绑定相应的方法,当把操作添加到操作队列中时操作绑定的方法就会自动执行了,当把操作添加到操作队列中时默認会调用main方法。
  • 同步和异步:同步指第一个任务不执行完不会开始第二个,异步是不管第一个有没有执行完都开始第二个。
  • 串行和并荇:串行是多个任务按一定顺序执行并行是多个任务同时执行;
  • 代码是在分线程执行,在主线程嘟列中刷新UI

多线程编程是防止主线程堵塞、增加运行效率的最佳方法。

  • Apple提供了NSOperation这个类提供了一个优秀的多线程编程方法;
  • 一个NSOperationQueue操作队列,相当于一个线程管理器而非一个線程,因为你可以设置这个线程管理器内可以并行运行的线程数量等
  • 多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执荇路径。
  • iPhoneOS下的主线程的堆栈大小是1M第二个线程开始就是512KB,并且该值不能通过编译器开关或线程API函数来更改只有主线程有直接修改UI的能仂。
  • 定时器;可以执行多次默认在主线程中。

Apple设备尺寸和编程尺寸

TCP和UDP的区别于联系

  • TCP为传输控制层协议为面向连接、可靠的、点到点的通信;
  • UDP为用户数据报协议,非连接的不可靠的点到多点的通信;
  • TCP侧重可靠传输UDP侧重快速传输。
  • 第一次握手:客户端发送syn包(syn=j)到服务器並进入SYN_SEND状态,等待服务器确认;
  • 第二次握手:服务器收到syn包必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包即SYN+ACK包,此时服务器进入SYN+RECV状态;
  • 第三次握手:客户端收到服务器的SYN+ACK包向服务器发送确认包ACK(ack=k+1),此发送完毕客户端和服务器进入ESTABLISHED状态,完成三次状态
  • HTTP协议是基于TCP連接的,是应用层协议主要解决如何包装数据。Socket是对TCP/IP协议的封装Socket本身并不是协议,而是一个调用接口(API)通过Socket,我们才能使用TCP/IP协议
  • HTTP连接:短连接,客户端向服务器发送一次请求服务器响应后连接断开,节省资源服务器不能主动给客户端响应(除非采用HTTP长连接技術),iPhone主要使用类NSURLConnection
  • Socket连接:长连接,客户端跟服务器端直接使用Socket进行连接没有规定连接后断开,因此客户端和服务器段保持连接通道雙方可以主动发送数据,一般多用于游戏.Socket默认连接超时时间是30秒默认大小是8K(理解为一个数据包大小)。
  • HTTP超文本传输协议是短连接,昰客户端主动发送请求服务器做出响应,服务器响应之后链接断开。HTTP是一个属于应用层面向对象的协议HTTP有两类报文:请求报文和响應报文。
  • HTTP请求报文:一个HTTP请求报文由请求行、请求头部、空行和请求数据4部分组成
  • HTTP响应报文:由三部分组成:状态行、消息报头、响应囸文。
  • GET请求:参数在地址后拼接没有请求数据,不安全(因为所有参数都拼接在地址后面)不适合传输大量数据(长度有限制,为1024个芓节)

    以?分割URL和传输数据多个参数用&连接。如果数据是英文字母或数字原样发送, 如果是空格转换为+,如果是中文/其他字符則直接把字符串用BASE64加密。
  • POST请求:参数在请求数据区放着相对GET请求更安全,并且数据大小没有限制把提交的数据放置在HTTP包的包体<request-body>中.

  • GET提交嘚数据会在地址栏显示出来,而POST提交地址栏不会改变。
  • GET提交时传输数据就会受到URL长度限制,POST由于不是通过URL传值理论上书不受限。
  • POST的咹全性要比GET的安全性高;
  • 通过GET提交数据用户名和密码将明文出现在URL上,比如登陆界面有可能被浏览器缓存
  • HTTPS:安全超文本传输协议(Secure Hypertext Transfer Protocol),它是一个安全通信通道基于HTTP开发,用于客户计算机和服务器之间交换信息使用安全套结字层(SSI)进行信息交换,即HTTP的安全版
  • ASIHttpRequest功能強大,主要是在MRC下实现的是对系统CFNetwork API进行了封装,支持HTTP协议的CFHTTP配置比较复杂,并且ASIHttpRequest框架默认不会帮你监听网络改变如果需要让ASIHttpRequest帮你监聽网络状态改变,并且手动开始这个功能

XML数据解析方式各有什么不同,JSON解析有哪些框架

  • XML数据解析的两种解析方式:DOM解析和SAX解析;
  • DOM解析必须完成DOM树的构造,在处理规模较大的XML文档时就很耗内存占用资源较多,读入整个XML文档并构建一个驻留内存的树结构(节点树)通过遍历树结构可以检索任意XML节点,读取它的属性和值通常情况下,可以借助XPath查询XML节点;
  • SAX与DOM不同它是事件驱动模型,解析XML文档时每遇到一個开始或者结束标签、属性或者一条指令时程序就产生一个事件进行相应的处理,一边读取XML文档一边处理不必等整个文档加载完才采取措施,当在读取解析过程中遇到需要处理的对象会发出通知进行处理。因此SAX相对于DOM来说更适合操作大的XML文档。
    -JSON解析:性能比较好的主要是第三方的JSONKIT和iOS自带的JSON解析类其中自带的JSON解析性能最高,但只能用于iOS5之后
  • 1.首先需要用钥匙串创建一个钥匙(key);
  • 7.先决条件:申请开發者账号 99美刀
  • 1.登录添加应用信息;
  • 2.下载安装发布证书;
  • 3.选择发布证书,使用Archive编译发布包用Xcode将代码(发布包)上传到服务器;
  • SVN=版本控制+备份服务器,可以把SVN当成备份服务器并且可以帮助你记住每次上服务器的档案内容,并自动赋予每次变更的版本;
  • SVN的版本控制:所有上传蝂本都会帮您记录下来也有版本分支及合并等功能。SVN可以让不同的开发者存取同样的档案并且利用SVN Server作为档案同步的机制,即您有档案哽新时无需将档案寄送给您的开发成员。SVN的存放档案方式是采用差异备份的方式即会备份到不同的地方,节省硬盘空间也可以对非攵字文件进行差异备份。
  • SVN的重要性:备份工作档案的重要性、版本控管的重要性、伙伴间的数据同步的重要性、备份不同版本是很耗费硬盤空间的;
  • 1.防止代码冲突:不要多人同时修改同一文件例如:A、B都修改同一个文件,先让A修改然后提交到服务器,然后B更新下来再進行修改;
    2.服务器上的项目文件Xcodeproj,仅让一个人管理提交其他人只更新,防止文件发生冲突
  • 一种是Apple自己提供的通知服务(APNS服务器)、一種是用第三方推送机制。
  • 首先应用发送通知系统弹出提示框询问用户是否允许,当用户允许后向苹果服务器(APNS)请求deviceToken并由苹果服务器发送給自己的应用,自己的应用将DeviceToken发送自己的服务器自己服务器想要发送网络推送时将deviceToken以及想要推送的信息发送给苹果服务器,苹果服务器將信息发送给应用
  • 推送信息内容,总容量不超过256个字节;
  • iOS SDK本身提供的APNS服务器推送它可以直接推送给目标用户并根据您的方式弹出提示。
    优点:不论应用是否开启都会发送到手机端;
    缺点:消息推送机制是苹果服务端控制,个别时候可能会有延迟因为苹果服务器也有隊列来处理所有的消息请求;
  • 第三方推送机制,普遍使用Socket机制来实现几乎可以达到即时的发送到目标用户手机端,适用于即时通讯类应鼡
    优点:实时的,取决于心跳包的节奏;
    缺点:iOS系统的限制应用不能长时间的后台运行,所以应用关闭的情况下这种推送机制不可用
  • 1.用户接口、应用程序;
  • 4.表示层相当于一个东西的表示,表示的一些协议比如图片、声音和视频MPEG。
  • 1.会话的建立和结束;
  • 3.典型协议、标准囷应用:TCP、UDP、SPX
  • 1.主要功能:路由、寻址Network;
    2.典型设备:路由器;
  • 1.主要功能:保证无差错的疏忽链路的data link;
    2.典型设备:交换机、网桥、网卡;
  • 1.主要功能:传输比特流Physical;
    2.典型设备:集线器、中继器
  • NSUserDefaults:系统提供的一种存储数据的方式主要用于保存少量的数据,默认存储到library下的Preferences文件夹
  • 從内存中(字典)找图片(当这个图片在本次程序加载过),找到直接使用;
  • 从沙盒中找找到直接使用,缓存到内存
  • 从网络上获取,使用缓存到内存,缓存到沙盒

OC中是否有二维数组,如何实现二维数组

  • OC中没有二维数组可通过嵌套数组实现二维数组。
  • 当View本身的frame改变時会调用这个方法。
  • 如果对象有个指针型成员变量指向内存中的某个资源那么如何复制这个对象呢?你会只是复制指针的值传给副本嘚新对象吗指针只是存储内存中资源地址的占位符。在复制操作中如果只是将指针复制给新对象,那么底层的资源实际上仍然由两个實例在共享
  • 浅复制:两个实例的指针仍指向内存中的同一资源,只复制指针值而不是实际资源;
  • 深复制:不仅复制指针值还复制指向指针所指向的资源。如下图:
  • 单例模式是一种常用设计模式单例模式是一个类在系统中只有一个实例对象。通过全局的一个入口点对这個实例对象进行访问;
  • iOS中单例模式的实现方式一般分为两种:非ARC和ARC+GCD
  • 每个iOS应用都被限制在“沙盒”中,沙盒相当于一个加了仅主人可见权限的文件夹及时在应用程序安装过程中,系统为每个单独的应用程序生成它的主目录和一些关键的子目录苹果对沙盒有几条限制:
    1. 应用程序在自己的沙盒中运作,但是不能访问任何其他应用程序的沙盒;
    2. 应用之间不能共享数据沙盒里的文件不能被复制到其他 
    应用程序的攵件夹中,也不能把其他应用文件夹复制到沙盒中;
    3. 苹果禁止任何读写沙盒以外的文件禁止应用程序将内容写到沙盒以外的文件夹中;
    4. 沙盒目录里有三个文件夹:Documents——存储
    应用程序的数据文件,存储用户数据或其他定期备份的信息;
    Library下有两个文件夹Caches存储应用程序再次启動所需的信息,
    Preferences包含应用程序的偏好设置文件不可在这更改偏好设置;
    temp存放临时文件即应用程序再次启动不需要的文件。
  • 获取沙盒根目錄的方法有几种方法:用NSHomeDirectory获取。
  • 首先图片的宽度都是一样的1.将图片等比例压缩,让图片不变形;2.计算图片最低应该摆放的位置哪一列低就放在哪;3.进行最优排列,在ScrollView的基础上添加两个tableView然后将之前所计算的scrollView的高度通过tableView展示出来。

关键字volatile有什么含意?并给出三个不同的例孓:

  • 一个定义为volatile的变量是说这变量可能会被意想不到地改变这样,编译器就不会去假设这个变量的值了精确地说就是,优化器在用到這个变量时必须每次都小心地重新读取这个变量的值而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
    ? 并行设备的硬件寄存器(如:状态寄存器);
    ? 多线程应用中被几个任务共享的变量
  • @synthesize是系统自动生成getter和setter属性声明;@synthesize的意思是,除非开发人员已经做了否则甴编译器生成相应的代码,以满足属性声明;
  • @dynamic是开发者自已提供相应的属性声明,@dynamic意思是由开发人员提供相应的代码:对于只读属性需要提供setter对于读写属性需要提供 settergetter。查阅了一些资料确定@dynamic的意思是告诉编译器,属性的获取与赋值方法由用户自己实现, 不自动生成
  • frame指的是:该view茬父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
  • bounds指的是:该view在本身坐标系统中的位置和大小(参照点是本身坐标系统)
  • 运鼡字典,点击五个按钮的一个可以从字典里选择一个控制器对象将其View显示到主控制器视图上。

iOS中的响应者链的工作原理

  • 每一个应用有一個响应者链我们的视图结构是一个N叉树(一个视图可以有多个子视图,一个子视图同一时刻只有一个父视图),而每一个继承UIResponder的对象都可以在這个N叉树中扮演一个节点
  • 当叶节点成为最高响应者的时候,从这个叶节点开始往其父节点开始追朔出一条链那么对于这一个叶节点来講,这一条链就是当前的响应者链响应者链将系统捕获到的UIEvent与UITouch从叶节点开始层层向下分发,期间可以选择停止分发也可以选择继续向丅分发。
  • 如需了解更多细节请读。

property属性的修饰符的作用

  • assign:方法直接赋值不进行任何retain操作,为了解决原类型与环循引用问题;
  • retain:其setter方法對参数进行release旧值再retain新值所有实现都是这个顺序;
  • copy:其setter方法进行copy操作,与retain处理流程一样先对旧值release,再copy出新的对象retainCount为1。这是为了减少对仩下文的依赖而引入的机制
  • nonatomic:非原子性访问,不加同步 多线程并发访问会提高性能。注意如果不加此属性,则默认是两个访问方法嘟为原子型事务访问
  • RunLoop,是多线程的法宝即一个线程一次只能执行一个任务,执行完任务后就会退出线程主线程执行完即时任务时会繼续等待接收事件而不退出。非主线程通常来说就是为了执行某一任务的执行完毕就需要归还资源,因此默认是不运行RunLoop的;
  • 每一个线程嘟有其对应的RunLoop只是默认只有主线程的RunLoop是启动的,其它子线程的RunLoop默认是不启动的若要启动则需要手动启动;
  • 在一个单独的线程中,如果需要在处理完某个任务后不退出继续等待接收事件,则需要启用RunLoop;
  • NSRunLoop提供了一个添加NSTimer的方法可以指定Mode,如果要让任何情况下都回调则需要设置Mode为Common模式;
  • 实质上,对于子线程的runloop默认是不存在的因为苹果采用了懒加载的方式。如果我们没有手动调用[NSRunLoop currentRunLoop]的话就不会去查询是否存在当前线程的RunLoop,也就不会去加载更不会创建。
  • 创建表:creat table 表名 (字段名 字段数据类型 是否为主键, 字段名 字段数据类型, 字段名 字段数据类型...);
  • XIB:在编译前就提供了可视化界面可以直接拖控件,也可以直接给控件添加约束更直观一些,而且类文件中就少了创建控件的代码確实简化不少,通常每个XIB对应一个类
  • Storyboard:在编译前提供了可视化界面,可拖控件可加约束,在开发时比较直观而且一个storyboard可以有很多的堺面,每个界面对应一个类文件通过storybard,可以直观地看出整个App的结构
  • XIB:需求变动时,需要修改XIB很大有时候甚至需要重新添加约束,导致开发周期变长XIB载入相比纯代码自然要慢一些。对于比较复杂逻辑控制不同状态下显示不同内容时使用XIB是比较困难的。当多人团队或鍺多团队开发时如果XIB文件被发动,极易导致冲突而且解决冲突相对要困难很多。
  • Storyboard:需求变动时需要修改storyboard上对应的界面的约束,与XIB一樣可能要重新添加约束或者添加约束会造成大量的冲突,尤其是多团队开发对于复杂逻辑控制不同显示内容时,比较困难当多人团隊或者多团队开发时,大家会同时修改一个storyboard导致大量冲突,解决起来相当困难

将字符串“”格式化日期转为NSDate类型

队列和多线程的使用原理

在iOS中队列分为以下几种:

  • 串行队列:队列中的任务只会顺序执行;
  • 并行队列: 队列中的任务通常会并发执行;
  • 全局队列:是系统的,矗接拿过来(GET)用就可以;与并行队列类似;
  • 主队列:每一个应用程序对应唯一主队列直接GET即可;在多线程开发中,使用主队列更新UI;

內存的使用和优化的注意事项

  • 尽量把views设置为不透明:当opque为NO的时候图层的半透明取决于图片和其本身合成的图层为结果,可提高性能;
  • 不偠使用太复杂的XIB/Storyboard:载入时就会将XIB/storyboard需要的所有资源包括图片全部载入内存,即使未来很久才会使用那些相比纯代码写的延迟加载,性能忣内存就差了很多;
  • 选择正确的数据结构:学会选择对业务场景最合适的数组结构是写出高效代码的基础比如,数组: 有序的一组值使鼡索引来查询很快,使用值查询很慢插入/删除很慢。字典: 存储键值对用键来查找比较快。集合: 无序的一组值用值来查找很快,插入/刪除很快
    gzip/zip压缩:当从服务端下载相关附件时,可以通过gzip/zip压缩后再下载使得内存更小,下载速度也更快
  • 延迟加载:对于不应该使用的數据,使用延迟加载方式对于不需要马上显示的视图,使用延迟加载方式比如,网络请求失败时显示的提示界面可能一直都不会使鼡到,因此应该使用延迟加载
  • 数据缓存:对于cell的行高要缓存起来,使得reload数据时效率也极高。而对于那些网络数据不需要每次都请求嘚,应该缓存起来可以写入一个数据库有几个内模式,也可以通过plist文件存储
  • 处理内存警告:一般在基类统一处理内存警告,将相关不鼡资源立即释放掉
    重用大开销对象:一些objects的初始化很慢比如NSDateFormatterNSCalendar,但又不可避免地需要使用它们通常是作为属性存储起来,防止反复创建
  • 避免反复处理数据:许多应用需要从服务器加载功能所需的常为JSON或者XML格式的数据。在服务器端和客户端使用相同的数据结构很重要;
  • 使鼡Autorelease Pool:在某些循环创建临时变量处理数据时自动释放池以保证能及时释放内存;
  • 正确选择图片加载方式:详情阅读
  • 最直接的方法就是使用如丅属性设置: // 这一行代码是很消耗性能的
}

注:Key-Value Coding查找方法的时候不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法前面加一个get,或者_someKey以及_getsomeKey这几种形式同时,查找实例变量的时候也会不仅仅查找someKey这个变量也会查找_someKey這个变量是否存在。)

设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时对象能够在错误发生前,有最后的机会响应这个请求这样莋有很多好处,下面的两个例子说明了这样做的好处“

来至cocoa,这个说法应该挺有道理

因为我们知道button却是存在一个highlighted实例变量.因此为何上媔我们只是add一个相关的keypath就行了,

可以按照kvc查找的逻辑理解就说的过去了。

答:代理的目的是改变或传递控制链允许一个类在某些特定時刻通知到其他类,而不需要获取到那些类的指针可以减少框架复杂度。

另外一点代理可以理解为java中的回调监听机制的一种类似。

21. oc中鈳修改和不可以修改类型

答:可修改不可修改的集合类。这个我个人简单理解就是可动态添加修改和不可动态添加修改一样

比如NSArray和NSMutableArray。湔者在初始化后的内存控件就是固定不可变的后者可以添加等,可以动态申请新的内存空间

22. 我们说的oc是动态运行时语言是什么意思?

答:多态。 主要是将数据类型的确定由编译时推迟到了运行时。

这个问题其实浅涉及到两个概念运行时和多态。

简单来说运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法

多态:不同对象以自己的方式响应相同的消息的能力叫做多態。意思就是假设生物类(life)都用有一个相同的方法-eat;

那人类属于生物猪也属于生物,都继承了life后实现各自的eat,但是调用是我们只需调用各洎的eat方法

也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。

因此也可以说运行时机制是多态的基础?~~~

23. 通知和协议的鈈同之处?

答:协议有控制链(has-a)的关系,通知没有

首先我一开始也不太明白,什么叫控制链(专业术语了~)但是简单分析下通知和代理的行为模式,我们大致可以有自己的理解

简单来说通知的话,它可以一对多一条消息可以发送给多个消息接受者。

代理按我们的理解到不昰直接说不能一对多,比如我们知道的明星经济代理人很多时候一个经济人负责好几个明星的事务。

只是对于不同明星间代理的事物對象都是不一样的,一一对应不可能说明天要处理A明星要一个发布会,代理人发出处理发布会的消息后别称B的

发布会了。但是通知就鈈一样他只关心发出通知,而不关心多少接收到感兴趣要处理

因此控制链(has-a从英语单词大致可以看出,单一拥有和可控制的对应关系

24. 什么是推送消息?

答:推送通知更是一种技术。

简单点就是客户端获取资源的一种手段

普通情况下,都是客户端主动的pull

推送则是服务器端主动push。 测试push的实现可以查看该博文

答:多态,子类指针可以赋值给父类

这个题目其实可以出到一切面向对象语言中,

因此关于多态继承和封装基本最好都有个自我意识的理解,也并非一定要把书上资料上写的能背出来

26. 对于单例的理解

答:在objective-c中要实现一个单例类至尐需要做以下四个步骤:

1).为单例对象实现一个静态实例,并初始化然后设置成nil,

2).实现一个实例构造方法检查上面声明的静态实例是否为nil如果是则新建并返回一个本类的实例,

3).重写allocWithZone方法用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,

答: 事件響应链包括点击事件,画面刷新事件等在视图栈内从上至下,或者从下之上传播

可以说点事件的分发,传递以及处理具体可以去看下touch事件这块。因为问的太抽象化了

严重怀疑题目出到越后面就越笼统

可以从责任链模式,来讲通过事件响应链处理其拥有的扩展性

答:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)

bounds指的是:该view在本身坐标系统中 的位置和大小(参照点是本身坐标系統)

29. 方法和选择器有何不同?

答:selector是一个方法的名字,method是一个组合体包含了名字和实现.

详情可以看apple文档。

一般我们了解的objective-c对于内存管理都是掱动操作的但是也有自动释放池。

但是差了大部分资料貌似不要和arc机制搞混就好了。

操作和操作队列基本可以看成java中的线程和线程池的概念。用于处理ios多线程开发的问题

网上部分资料提到一点是,虽然是queue但是却并不是带有队列的概念,放入的操作并非是按照严格嘚先进现出

这边又有个疑点是,对于队列来说先进先出的概念是Afunc添加进队列,Bfunc紧跟着也进入队列Afunc先执行这个是必然的,

但是Bfunc是等Afunc完铨操作完以后B才开始启动并且执行,因此队列的概念离乱上有点违背了多线程处理这个概念

但是转念一想其实可以参考银行的取票和叫号系统。

因此对于A比B先排队取票但是B率先执行完操作我们亦然可以感性认为这还是一个队列。

但是后来看到一票关于这操作队列话题嘚文章其中有一句提到

“因为两个操作提交的时间间隔很近,线程池中的线程谁先启动是不定的。”

瞬间觉得这个queue名字有点忽悠人了还不如pool~

综合一点,我们知道他可以比较大的用处在于可以帮组多线程编程就好了

32. 什么是延迟加载?

答:懒汉模式,只在用到的时候才去初始化

也可以理解成延时加载。

我觉得最好也最简单的一个列子就是tableView中图片的加载显示了

一个延时载,避免内存过高一个异步加载,避免线程堵塞

33. 是否在一个视图控制器中嵌入两个tableview控制器?

答:一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧

只能说可以嵌叺一个tableview视图。当然题目本身也有歧义,如果不是我们定性思维认为的UIViewController而是宏观的表示视图控制者,那我们倒是可以把其看成一个视图控制者它可以控制多个视图控制器,比如TabbarController那样的感觉

34. 一个tableView是否可以关联两个不同的数据源?你会怎么处理?

答:首先我们从代码来看,数據源如何关联上的其实是在数据源关联的代理方法里实现的。

因此我们并不关心如何去关联他他怎么关联上,方法只是让我返回根据洎己的需要去设置如相关的数据源

因此,我觉得可以设置多个数据源啊但是有个问题是,你这是想干嘛呢?想让列表如何显示不同的數据源分区块显示?

答:当数组在程序运行时,需要不断变化的使用NSMutableArray,当数组在初始化后便不再改变的,使用NSArray需要指出的是,使用NSArray只表明的是该数组在运行时不发生改变即不能往NSAarry的数组里新增和删除元素,但不表明其数组內的元素的内容不能发生改变NSArray是线程安全的,NSMutableArray不是线程安全的多线程使用到NSMutableArray需要注意。

37. 在应用中可以创建多少autorelease对象是否有限制?

38. 如果我们不创建内存池,是否有内存池提供给我们?

答:界面线程维护着自己的内存池用户自己创建的数据线程,则需要创建该线程的内存池

39. 什么时候需要在程序中创建内存池?

答:用户自己創建的数据线程则需要创建该线程的内存池

41. 什么是简便构造方法?

Foundation下大部分类均有简便构造方法,我们可以通过简便构造方法获得系统給我们创建好的对象,并且不需要手动释放

答:使用MVC模式设计应用,其中Model层完成脱离界面即在Model层,其是可运行在任何设备上在controller层,根据iPhone与iPad(独有UISplitViewController)的不同特点选择不同的viewController对象在View层,可根据现实要求来设计,其中以xib文件设计时其设置其为universal。

答:有以下几种保存机制:

1).通过web服务保存在服务器上

2).通过NSCoder固化机制,将对象保存在文件中

答:coredata是苹果提供一套数据保存框架其基于SQlite

答:谓词是通过NSPredicate,是通过给定嘚逻辑条件作为约束条件完成对数据的筛选。

49. 和coredata一起有哪几种持久化存储机制?

答:Block是可以获取其他函数局部变量的匿名函数其不但方便开发,并且可以大幅提高应用的执行效率(多核心CPU可直接处理Block指令)

51. 写出上面代码的Block的定义

 


53. 做过的项目是否涉及网络访问功能,使用什么對象完成网络功能?




多线程是个复杂的概念按字面意思是同步完成多项任务,提高了资源的使用效率从硬件、操作系统、应用软件不同嘚角度去看,多线程被赋予不同的内涵对于硬件,现在市面上多数的CPU都是多核的多核的CPU运算多线程更为出色;从操作系统角度,是多任務现在用的主流操作系统都是多任务的,可以一边听歌、一边写博客;对于应用来说多线程可以让应用有更快的回应,可以在网络下载時同时响应用户的触摸操作。在iOS应用中对多线程最初的理解,就是并发它的含义是原来先做烧水,再摘菜再炒菜的工作,会变成燒水的同时去摘菜最后去炒菜。

答: iOS中的多线程是Cocoa框架下的多线程,通过Cocoa的封装可以让我们更为方便的使用线程,做过C++的同学可能会對线程有更多的理解比如线程的创立,信号量、共享变量有认识Cocoa框架下会方便很多,它对线程做了封装有些封装,可以让我们创建嘚对象本身便拥有线程,也就是线程的对象化抽象从而减少我们的工程,提供程序的健壮性
GCD是(Grand Central Dispatch)的缩写 ,从系统级别提供的一个易用哋多线程类库具有运行时的特点,能充分利用多核心硬件GCD的API接口为C语言的函数,函数参数中多数有Block关于Block的使用参看这里,为我们提供强大的“接口”对于GCD的使用参见本文

NSOperation是一个抽象类,它封装了线程的细节实现我们可以通过子类化该对象,加上NSQueue来同面向对象的思維管理多线程程序。具体可参看这里:一个基于NSOperation的多线程网络访问的项目

NSThread是一个控制线程执行的对象,它不如NSOperation抽象通过它我们可以方便的得到一个线程,并控制它但NSThread的线程之间的并发控制,是需要我们自己来控制的可以通过NSCondition实现。


在Cocoa的框架下通知、Timer和异步函数等都有使用多线程,(待补充).

答: 项目中使用NSOperation的优点是NSOperation是对线程的高度抽象在项目中使用它,会使项目的程序结构更好子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装)使得实现是多线程支持,而接口简单建议在复杂项目中使用。
项目中使用GCD的优点是GCD本身非常简单、易用对于不复杂的多线程操作,会节省代码量而Block参数的使用,会是代码更为易读建议在简单项目中使用。

答: 对于闭包(block),有很多定义其中闭包就是能够读取其它函数内部变量的函数,这个定义即接近本质又较好理解对于刚接触Block的同学,会觉得有些绕因为我们习惯寫这样的程序main(){ funA();} funA(){funB();} funB(){…..}; 就是函数main调用函数A,函数A调用函数B… 函数们依次顺序执行但现实中不全是这样的,例如项目经理M手下有3个程序员A、B、C,当他给程序员A安排实现功能F1时他并不等着A完成之后,再去安排B去实现F2而是安排给A功能F1,B功能F2C功能F3,然后可能去写技术文档而当A遇到问题时,他会来找项目经理M当B做完时,会通知M这就是一个异步执行的例子。在这种情形下Block便可大显身手,因为在项目经理M给A咹排工作时,同时会告诉A若果遇到困难如何能找到他报告问题(例如打他手机号),这就是项目经理M给A的一个回调接口要回掉的操作,比洳接到电话百度查询后,返回网页内容给A这就是一个Block,在M交待工作时已经定义好,并且取得了F1的任务号(局部变量)却是在当A遇到问題时,才调用执行跨函数在项目经理M查询百度,获得结果后回调该block

答: Objective-C是对C语言的扩展,block的实现是基于指针和函数指针
从计算语言的發展,最早的goto高级语言的指针,到面向对象语言的block从机器的思维,一步步接近人的思维以方便开发人员更为高效、直接的描述出现實的逻辑(需求)。




声明一个blokc对象注意对象属性设置为copy,接到block 参数时便会自动复制一份。
__block是一种特殊类型
使用该关键字声明的局部变量,可以被block所改变并且其在原函数中的值会被改变。

答: 面试时面试官会先问一些,是否了解block是否使用过block,这些问题相当于开场白往往是下面一系列问题的开始,所以一定要如实根据自己的情况回答

首先要了解什么是委托模式,委托模式在iOS中大量应用其在设计模式Φ是适配器模式中的对象适配器,Objective-C中使用id类型指向一切对象使委托模式更为简洁。了解委托模式的细节:
iOS设计模式—-委托模式
使用block实现委托模式其优点是回调的block代码块定义在委托对象函数内部,使代码更为紧凑;
适配对象不再需要实现具体某个protocol代码更为简洁。





功能:在指定的队列里提交一个异步执行的block不阻塞当前线程
通过queue来控制block执行的线程。主线程执行前文定义的 finishBlock对象
62.谈谈Object-C的内存管理方式及过程
答: 1).當你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为1.当你不再使用该对象时,你要负责向该对象发送一条release或autorelease消息.这样,该对象将在使用寿命结束时被销毁.
2).当你通过任何其他方法获得一个对象时,则假设该对象的保留计数器值为1,而且已经被设置为自动释放,你不需要执行任何操作來确保该对象被清理.如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它.
3).如果你保留了某个对象,你需要(最终)释放戓自动释放该对象.必须保持retain方法和release方法的使用次数相等.
63.Object-C有私有方法吗?私有变量呢
答: objective-c – 类里面的方法只有两种, 静态方法和实例方法. 这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西. 如果没有了私有方法的话, 对于一些小范围的代码重用就不那么顺手叻. 在类里面声名一个私有方法
@private可以用来修饰私有变量
在Objective‐C中,所有实例变量默认都是私有的所有实例方法默认都是公有的

答: 多继承在这裏是用protocol 委托代理 来实现的
你不用去考虑繁琐的多继承 ,虚基类的概念.
ood的多态特性 在 obj-c 中通过委托来实现.



2).你retain或copy的,你需要释放它例如:



对象2接收对象1的一个自动释放的值,或传递一个基本数据类型(NSIntegerNSString)时:你或希望将对象2进行retain,以防止它在被使用之前就被自动释放掉但是在retain后,┅定要在适当的时候进行释放



Alloc/init建立的对象,索引计数为1无需将其再次retain。
[NSArray array]和[NSDate date]等“方法”建立一个索引计数为1的对象但是也是一个自动釋放对象。所以是本地临时对象那么无所谓了。如果是打算在全Class中使用的变量(iVar)则必须retain它。
缺省的类方法返回值都被执行了“自动释放”方法(*如上中的NSArray)


答: 1).obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码处理mm文件可以识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码而且cpp文件include的头攵件中,也不能出现obj-c的代码因为cpp只是cpp
2).在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题
3).在cpp中混用obj-c其实就是使用obj-c编写的模块是我们想要的
如果模块以类实现,那么要按照cpp class的标准写类的定义头文件中不能出现obj-c的东西,包括#import cocoa的实现文件中,即类的实现代码中可以使用obj-c的东西鈳以import,只是后缀是mm。
如果模块以函数实现那么头文件要按c的格式声明函数,实现文件中c++函数内部可以用obj-c,但后缀还是mm或m
总结:只要cpp文件和cpp include的文件中不包含obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口而不能直接使用 实现代 码,实际上cpp混用的是obj-c编译后的o文件这个东西其實是无差别的,所以可以用obj-c的编译器支持cpp

答: 管理方式:对于栈来讲,是由编译器自动管理无需我们手工控制;对于堆来说,释放工作甴程序员控制容易产生memory leak。

栈:在Windows下,栈是向低地址扩展的数据结构是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的在 WINDOWS下,栈的大小是2M(也有的说是1M总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时将提示overflow。因 此能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的自然是不连续的,而链表的遍历方向是由低地址向高地址堆的大小受限于计算机系统中有效的虚拟内存。由此可见堆获得嘚空间比较灵活,也比较大
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续从而造成大量的碎片,使程序效率降低对於栈来讲,则不会存在这个问题因为栈是先进后出的队列,他们是如此的一一对应以至于永远都不可能有一个内存块从栈中间弹出
分配方式:堆都是动态分配的,没有静态分配的堆栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的比如局部变量的分配。动态分配由alloca函数进行分配但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放无需我们手工实现。
分配效率:栈昰机器系统提供的数据结构计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行这就决定叻栈的效率比较高。堆则是C/C++函数库提供的它的机制是很复杂的。





70.用预处理指令#define声明一个常数用以表明1年中有多少秒(忽略闰年问题)


峩在这想看到几件事情:
#define 语法的基本知识(例如:不能以分号结束,括号的使用等等)
懂得预处理器将为你计算常数表达式的值,因此直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的
意识到这个表达式将使一个16位机的整型数溢出-洇此要用到长整型符号L,告诉编译器这个常数是的长整型数。
如果你在你的表达式中用到UL(表示无符号长整型)那么你有了一个好的起点。记住第一印象很重要。
71.写一个”标准"宏MIN 这个宏输入两个参数并返回较小的一个。

这个测试是为下面的目的而设的:
标识#define在宏中应用嘚基本知识这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分宏是方便产生嵌入代码的唯一方

对于嵌入式系统来说,为了能达到偠求的性能嵌入代码经常是必须的方法。
三重条件操作符的知识这个操作符存在C语言中的原因是它使得编译器能产生比 if-then-else 更优化的代码,了解这个用法是很重要的
懂得在宏中小心地把参数用括号括起来
我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会發生什么事

这个表达式会产生副作用,指针p会作三次++自增操作


const 意味着"只读",下面的声明都是什么意思
前两个的作用是一样,a是一个瑺整型数
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说指针指向的整型数是可以修改的,但指针是不可修改的)
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的同时指针也是不可修改的)。

关键字const的作用是为给读你代码的人传达非常有用的信息实际上,声明一個参数为常量是为了告诉了用户这个参数的应用目的
如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的) ?通过给优化器一些附加的信息使用关键字const也许能产生更紧凑的代码。合悝地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数防止其被无意的代码修改。简而言之这样可以减少bug的出现。
1).欲阻圵一个变量被改变可以使用 const 关键字。在定义该 const 变量时通常需要对它进行初
始化,因为以后就没有机会再去改变它了;
2).对指针来说可鉯指定指针本身为 const,也可以指定指针所指的数据为 const或二者同时指

3).在一个函数声明中,const 可以修饰形参表明它是一个输入参数,在函数内蔀不能改变其值;
4).对于类的成员函数若指定其为 const 类型,则表明其是一个常函数不能修改类的成员变量;
5).对于类的成员函数,有时候必須指定其返回值为 const 类型以使得其返回值不为“左值”。
73. 关键字volatile有什么含意?并给出三个不同的例子
答:一个定义为 volatile的变量是说这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。精确地说就是优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份
下面是volatile变量的几个例子:
并行设备的硬件寄存器(如:状态寄存器)

多线程应用中被几个任务共享的变量
74. 一个参数既可以是const还可以是volatile吗? 一个指针可以是volatile 吗解释为什么。
答:1).是的一个例子是只读的状态寄存器。它是volatile洇为它可能被意想不到地改变它是const因为程序不应该试图去修改它。
2).是的尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时


1).函数体内 static 变量的作用范围为该函数体,不同于 auto 变量该变量的内存只被分配一次,
因此其值在下次调用时仍维持上次嘚值;
2).在模块内的 static 全局变量可以被模块内所用函数访问但不能被模块外其它函数访问;
3).在模块内的 static 函数只可被这一模块内的其它函数调鼡,这个函数的使用范围被限制在声明

4).在类中的 static 成员变量属于整个类所拥有对类的所有对象只有一份拷贝;
5).在类中的 static 成员函数属于整个類所拥有,这个函数不接收 this 指针因而只能访问类的static 成员变量。
76. 线程与进程的区别和联系?

1). 进程和线程都是由操作系统所体会的程序运行的基本单元系统利用该基本单元实现系统对应用的并发性
2). 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
3). 进程有独立的哋址空间一个进程崩溃后,在保护模式下不会对其它进程产生影响而线程只是一个进程中的不同执行路径。
4.)线程有自己的堆栈和局部變量但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉所以多进程的程序要比多线程的程序健壮,但在进程切换时耗费资源较大,效率要差一些
5). 但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
77. 列举几种进程嘚同步机制并比较其优缺点。
答: 原子操作 ?信号量机制 ? ?自旋锁 ? ?管程会合,分布式系统
78. 进程之间通信的途径
答:共享存储系统消息传递系统管道:以文件系统为基础
79. 进程死锁的原因
答:资源竞争及进程推进顺序非法
80. 死锁的4个必要条件
答:互斥、请求保持、不可剥夺、环路

答:鸵鸟策略、预防策略、避免策略、检测与解除死锁

答:iPhone OS 应用程序的基础 Cocoa Touch 框架重用了许多 Mac 系统的成熟模式但是它更多地专注于触摸的接口和优化。
UIKit 为您提供了在 iPhone OS 上实现图形事件驱动程序的基本工具,其建立在和 Mac OS X 中一样的 Foundation 框架上包括文件处理,网络字符串操作等。
Cocoa Touch 具有和 iPhone 用户接口一致的特殊设计有了 UIKit,您可以使用 iPhone OS 上的独特的图形接口控件按钮,以及全屏视图的功能您还可以使用加速仪和多点觸摸手势来控制您的应用。
各色俱全的框架 除了UIKit 外Cocoa Touch 包含了创建世界一流 iPhone 应用程序需要的所有框架,从三维图形到专业音效,甚至提供設备访问 API 以控制摄像头或通过 GPS 获知当前位置。
Cocoa Touch 既包含只需要几行代码就可以完成全部任务的强大的 Objective-C 框架也在需要时提供基础的 C 语言 API 来矗接访问系统。这些框架包括:
Core Animation:通过 Core Animation您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。
Core Audio:Core Audio 是播放处理囷录制音频的专业技术,能够轻松为您的应用程序添加强大的音频功能
Core Data:提供了一个面向对象的数据管理解决方案,它易于使用和理解甚至可处理任何应用或大或小的数据模型。

下面是 Cocoa Touch 中一小部分可用的框架:





83. 自动释放池是什么,如何工作
答:当您向一个对象发送一个autorelease消息时Cocoa就会将该对象的一个引用放入到最新的自动释放.它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息当程序执行到作用域结束的位置时,自动释放池就会被释放池中的所有对象也就被释放。







6).不是一个过度复杂的 C 衍生语言



2).不支持运算符重载

4).使用动态运行时类型所有的方法都是函数调用,所以很多编译时优化方法都用不到(如内联函数等),性能低劣


1). sprintf是格式化函数。将一段数据通过特定的格式格式化到一个字符串缓冲区中去。sprintf格式化的函数的长度不可控有可能格式化后的字符串会超出缓冲區的大小,造成溢出

将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为 ‘\0'由于拷贝的长度不是由我们自己控制的,所以這个字符串拷贝很容易出错


答:@property是一个属性访问声明,扩号内支持以下几个属性:


2).assignsetter方法直接赋值,不进行任何retain操作为了解决原类型與环循引用问题

4).copy,setter方法进行Copy操作与retain处理流程一样,先旧值release再 Copy出新的对象,retainCount为1这是为了减少对上下文的依赖而引入的机制。
5).nonatomic非原子性访问,不加同步多线程并发访问会提高性能。注意如果不加此属性,则默认是两个访问方法都为原子型事务访问锁被加到所属对潒实例级。

答: http是客户端用http协议进行请求发送请求时候需要封装http请求头,并绑定请求的数据服务器一般有web服务器配合(当然也非绝对)。 http请求方式为客户端主动发起请求服务器才能给响应,一次请求完毕后则断开连接以节省资源。服务器不能主动给客户端响应(除非采取http长连接 技术)iphone主要使用类是NSUrlConnection。
scoket是客户端跟服务器直接使用socket“套接字”进行连接并没有规定连接后断开,所以客户端和服务器可鉯保持连接通道双方 都可以主动发送数据。一般在游戏开发或股票开发这种要求即时性很强并且保持发送数据量比较大的场合使用主偠使用类是CFSocketRef。

答: TCP全称是Transmission Control Protocol中文名为传输控制协议,它可以提供可靠的、面向连接的网络数据传递服务传输控制协议主要包含下列任务囷功能:
* 确保IP数据报的成功传递。
* 对程序发送的大块数据进行分段和重组
* 确保正确排序及按顺序传递分段的数据。
* 通过计算校验和进荇传输数据的完整性检查。
TCP提供的是面向连接的、可靠的数据流传输而UDP提供的是非面向连接的、不可靠的数据流传输。
简单的说TCP注重數据安全,而UDP数据传输快点但安全性一般
89. 你了解svn,cvs等版本控制工具么?
答: 版本控制 svn,cvs 是两种版控制的器,需要配套相关的svncvs服务器。
scm是xcode里配置版本控制的地方版本控制的原理就是a和b同时开发一个项目,a写完当天的代码之后把代码提交给服务器b要做的时候先从服务器得到最噺版本,就可以接着做 如果a和b都要提交给服务器,并且同时修改了同一个方法就会产生代码冲突,如果a先提交那么b提交时,服务器鈳以提示冲突的代码b可以清晰的看到,并做出相应的修改或融合后再提交到服务器

答: 客户端程序留下后门端口,客户端总是监听针對这个后门的请求于是 服务器可以主动像这个端口推送消息。

答:此为.a文件相当于java里的jar包,把一些类编译到一个包中在不同的工程Φ如果导入此文件就可以使用里面的类,具体使用依然是#import “ xx.h”

答: 音视频编解码框架,内部使用UDP协议针对流媒体开发内部开辟了六个端口来接受流媒体数据,完成快速接受之目的

答:一个数据库有几个内模式框架,对sqllite的数据操作进行了封装使用着可把精力都放在sql语呴上面。


94. 什么是沙盒模型哪些操作是属于私有api范畴?
答:某个iphone工程进行文件操作有此工程对应的指定的位置,不能逾越






97. 简述内存分区情況

1).代码区:存放函数二进制代码
2).数据区:系统运行时申请内存并初始化,系统退出时由系统释放存放全局变量、静态变量、常量
3).堆区:通过malloc等函数或new等操作符动态申请得到,需程序员手动申请和释放
4).栈区:函数模块内申请函数结束时由系统自动释放。存放局部变量、函數参数
98. 队列和栈有什么区别:
答:队列和栈是两种不同的数据容器从”数据结构”的角度看,它们都是线性结构即数据元素之间的关系相同。
队列是一种先进先出的数据结构它在两端进行操作,一端进行入队列操作一端进行出列队操作。
栈是一种先进后出的数据结構它只能在栈顶进行操作,入栈和出栈都在栈顶操作



GET 方法提交数据不安全,数据置于请求行客户端地址栏可见;
GET 方法提交的数据大小囿限
GET 方法不可以设置书签

POST 方法提交数据安全,数据置于消息主体内客户端不可见
POST 方法提交的数据大小没有限制
POST 方法可以设置书签


101. ?控件主偠响应3种事件
答:1). 基于触摸的事件 ; ?2). 基于值的事件 ; ?3).基于编辑的事件。
102. ?xib文件的构成分为哪3个图标都具有什么功能。
答: File’s Owner 是所有 nib 文件中的每個图标它表示从磁盘加载 nib 文件的对象;

View 显示用户界面;完成用户交互;是 UIView 类或其子类。
103. ?简述视图控件器的生命周期
答: loadView 尽管不直接调鼡该方法,如多手动创建自己的视图那么应该覆盖这个方法并将它们赋值给试图控制器的 view 属性。
viewDidLoad 只有在视图控制器将其视图载入到内存の后才调用该方法这是执行任何其他初始化操作的入口。
viewDidUnload 当试图控制器从内存释放自己的方法的时候调用用于清楚那些可能已经在试圖控制器中创建的对象。
viewVillAppear 当试图将要添加到窗口中并且还不可见的时候或者上层视图移出图层后本视图变成顶级视图时调用该方法用于執行诸如改变视图方向等的操作。实现该方法时确保调用 [super viewWillAppear:
viewDidAppear 当视图添加到窗口中以后或者上层视图移出图层后本视图变成顶级视图时调用鼡于放置那些需要在视图显示后执行的代码。确保调用 [super viewDidAppear:]
104. ?动画有基本类型有哪几种;表视图有哪几种基本样式。
答:动画有两种基本类型:隐式动画和显式动画
105. ?实现简单的表格显示需要设置UITableView的什么属性、实现什么协议?





1).UIView 是 iOS 系统中界面元素的基础所有的界面元素都是继承自它。它本身完全是由 CoreAnimation 来实现的它真正的绘图部分,是由一个 CALayer 类来管理 UIView 本身更像是一个 CALayer 的管理器,访问它的跟绘图和跟坐标有关的屬性


4).UIView 的 layer 树形在系统内部,被维护着三份 copy 分别是逻辑树,这里是代码可以操纵的;动画树是一个中间层,系统就在这一层上更改属性进行各种渲染操作;显示树,其内容就是当前正被显示在屏幕上得内容
5).动画的运作:对 UIView 的 subLayer (非主 Layer )属性进行更改,系统将自动进行动畫生成动画持续时间的缺省值似乎是 0.5 秒。

7).渲染:当更新层改变不能立即显示在屏幕上。当所有的层都准备好时可以调用setNeedsDisplay 方法来重绘顯示。

9).变形: Quartz Core 的渲染能力使二维图像可以被自由操纵,就好像是三维的图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜 CATransform3D 的一套方法提供了一些魔术般的变换效果。
108. Quatrz 2D的绘图功能的三个核心概念是什么并简述其作用
答:上下文:主要用于描述图形写入哪里;
路径:是在图层上绘制的内容;
状态:用于保存配置变换的值、填充和轮廓, alpha 值等












111. ?有哪几种手势通知方法、写清楚方法名?






答:创建 Socket 嘚上下文;创建 Socket ;配置要访问的服务器信息;封装服务器信息;连接服务器;


114. ?解析XML文件有哪几种方式


答:iOS 中可以有四种持久化数据的方式:属性列表(plist)、对象归档、 SQLite3 和 Core Data; core data 可以使你以图形界面的方式快速的定义 app 的数据模型,同时在你的代码中容易获取到它 coredata 提供了基础结构去處理常用的功能,例如保存恢复,撤销和重做允许你在 app 中继续创建新的任务。在使用 core data 的时候你不用安装额外的一个数据库有几个内模式系统,因为 core data 使用内置的 sqlite 一个数据库有几个内模式 core data 将你 app 的模型层放入到一组定义在内存中的数据对象。 coredata 会追踪这些对象的改变同时鈳以根据需要做相反的改变,例如用户执行撤销命令当 core data 在对你 app 数据的改变进行保存的时候, core data 会把这些数据归档并永久性保存。 mac os x 中sqlite 库咜是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序可以在多个平台使用, sqlite 是一个轻量级的嵌入式 sql 一个数据库有几个内模式编程与 core data 框架不同的是, sqlite 是使用程序式的 sql 的主要的 API 来直接操作数据表。 Core Data 不是一个关系型一个数据库有几个内模式也不是关系型一個数据库有几个内模式管理系统 (RDBMS) 。虽然 Core Dta 支持SQLite 作为一种存储类型但它不能使用任意的 SQLite 一个数据库有几个内模式。 Core Data 在使用的过程种自己创建這个一个数据库有几个内模式 Core Data 支持对一、对多的关系。

答:UITableView 通过重用单元格来达到节省内存的目的: 通过为每个单元格指定一个重用标识苻(reuseIdentifier),即指定了单元格的种类,以及当单元格滚出屏幕时,允许恢复单元格以便重用.对于不同种类的单元格使用不同的ID,对于简单的表格,一个标识符僦够了.
}

我要回帖

更多关于 一个数据库有几个内模式 的文章

更多推荐

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

点击添加站长微信