ios面试题集锦(一)

1、前言部分

文中的问题多收集整理自网络,不保证100%准确,还望斟酌采纳。java

 

一、iOS9有哪些新特性?

答案:程序员

  1)改进了 Siriweb

  基于日期、位置和相簿名称来搜索我的照片和视频
  要求 Siri 来提醒您在 Safari、“邮件”、“备忘录”和“信息”等应用中看到的有关内容
  提供大众公交路线objective-c

  2)加强 Spotlight 搜索功能数据库

  获取体育比分、天气情况和股票价格
  执行简单的数学计算和单位换算
  在联系人的搜索结果中发送信息、拨打电话和 FaceTime 通话设计模式

  3)新增 iPad 功能数组

  4)Slide Over缓存

  不用离开正在使用的应用便可快速使用另外一款应用
  在 Slide Over 应用之间轻松切换
  支持 Apple 应用和已启用的第三方应用安全

  5)Split View服务器

  可同时查看两个应用并与之互动
  可以调整视图,让两个应用大小相同,或一大一小
  支持 Apple 应用和已启用的第三方应用
 
  6)新增画中画功能

  一边使用您喜好的应用一边继续观看视频
  支持 Safari 视频、FaceTime、视频和播客及已启用的第三方应用

  7)改进了 QuickType

  利用 Multi-Touch 手势,在 iPad 上选择文本更为轻松
  在 iPad 上利用快捷工具栏来快速访问文本编辑工具
  支持硬件键盘快捷键
  支持全部 Unicode 旗帜表情符号

  8)改进了“地图”

  支持特选大城市中的大众公交路线、车站进出站口信息、时刻安排和路线
  根据诸如食物、饮料、购物和娱乐之类的类别来浏览您附近的地点
  在加盟零售方的地点卡上显示该处是否支持 Apple Pay
  地点卡包括维基百科上关于地标和城市的信息

  9)从新设计了“备忘录”应用

  用内建相机或从“照片图库”将照片来添加到您的备忘录中
  建立实用的核对清单,轻点一下便可勾选已完成的项目
  仅用单指速绘,便可记下闪现的想法
  利用其余应用中的“共享”菜单直接将感兴趣的项目存储到“备忘录”中

  10)全新的 News 新闻应用

  阅读喜好的报纸、杂志、博客,或从一百万多个主题中选读
  精美的设计排版、布局、图库、视频、动画及更多内容
  在“为你推荐”中浏览根据您的兴趣爱好挑选出来的文章。在“探索”中查找推荐的频道和主题。您阅读的内容越多,News 新闻就越

    个性化轻松与朋友共享文章或将文章存储起来稍后阅读-您甚至能够离线阅读

  11)改进了“邮件”

  搜索功能可根据发件人、收件人、主题或选项组合来过滤搜索结果,帮您快速找到要寻找的内容
  支持“标记”功能,让您无需离开“邮件”便可给图像或 PDF 附件添加文本、形状,甚至签名等注释,并发回邮件
  轻松存储收到的附件,或者在编写新邮件时添加来自 iCloud Drive 或其余文稿提供者的文件

  12)改进了 Apple Pay 和 Wallet

  支持 Discover 卡
  支持回馈卡、商店信用卡和借记卡
  若要加速结帐,您能够在锁屏连点两下主屏幕按钮,并将手指放在 Touch ID 上来准备付款

  13)新建 iCloud Drive 应用

  按照日期、名称或您在 Mac 上添加的标记来轻松搜索文件,或者浏览新 iCloud Drive
  在兼容的应用中打开文件,或者与您选择的对象共享
  整理文件夹和文件
  在“设置”> iCloud > iCloud Drive 中获取 iCloud Drive 应用,而后选择“在主屏幕上显示”

  14)改进了 CarPlay

  回放音频留言,听取留言者本身的声音
  彻底支持车内旋钮控制,您能够倾斜或旋转来滚动浏览列表或者平移查看“地图”
  支持汽车制造商的 CarPlay 应用  

  15)延长了电池使用寿命

  在须要充电前增长了最多一小时的可用时间
  检测屏幕朝下的状态,在不用时关闭显示器
  低电量模式下最优化设备性能,可将电池电量延长最多三小时 

 

二、http请求方式有哪些?

答案:

      1)GET
  2)HEAD
  3)PUT
  4)DELETE
  5)POST
  6)OPTIONS

 

三、uiview的圆角属性设置方法?

答案:

      1)m_mainImgView.layer.cornerRadius = 具体数值;

      2)m_mainImgView.layer.masksToBounds= YES;

 

四、masksToBounds属性的做用是什么?

答案:

       决定子layer是否被当前layer的边界剪切,默认是NO

 

五、描述iOS程序的运行流程 ?

答案:

      1. 系统调用app的main函数

      2. main函数调用UIApplicationMain.

      3. UIApplicationMain建立sharedapplication instance, UIApplication默认的instance.

      4. UIApplicationMain读取Info.plist找到主nib文件, 加载nib,把shared applicationinstance 设为nib的owner.

      5. 经过nib文件,建立app的独立UIWindows object.

      6. 经过nib,实例化了程序的AppDelegate object.

     7. app内部启动结束,application:didFinishLaunchingWith-Options: 被设定成 wAppDelegate instance.

     8. AppDelegate向UIWindowinstance发makeKeyAndVisible消息, app界面展现给用户. app准备好接收用户的操做指令.

 

六、 iOS内存管理的方式有哪些?

答案:

      手动管理(MRC)   自动内存管理(ARC)

 

七、 Object-C有多继承吗?没有的话用什么代替?

答案:

       OC 自己是没有多继承的,可是咱们能够经过协议来实现相似C++中的多继承。

 

九、属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么做用,在那种状况下用?

答案:
  1. readwrite 是可读可写特性;须要生成getter方法和setter方法时
  2. readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不但愿属性在类外改变
  3. assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
  4. retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;
  5. copy 表示赋值特性,setter方法将传入对象复制一份;须要彻底一份新的变量时。
  6. nonatomic 非原子操做,决定编译器生成的setter getter是不是原子操做,atomic表示多线程安全,

   通常使用nonatomic 

 

九、对于语句NSString*obj = [[NSData alloc] init]; obj在编译时和运行时分别时什么类型的对象?

答案:
  编译时是NSString的类型;运行时是NSData类型的对象

 

十、id 声明的对象有什么特性?

答案:
   id 声明的对象具备运行时的特性,便可以指向任意类型的objcetive-c的对象;

 

十一、 原子(atomic)跟非原子(non-atomic)属性有什么区别?

答案:
  1. atomic提供多线程安全。是防止在写未完成的时候被另一个线程读取,形成数据错误
  2. non-atomic:在本身管理内存的环境中,解析的访问器保留并自动释放返回的值,若是指定了 nonatomic ,

  那么访问器只是简单地返回这个值。

 

十二、 类别和类扩展的区别是什么? 

答案:

       category和extensions的不一样在于 后者能够添加属性。另外后者添加的方法是必需要实现的。
       extensions能够认为是一个私有的Category。

 

1三、 在iOS应用中如何保存数据?

答案:

     有如下几种保存机制:
  1.经过web服务,保存在服务器上
  2.经过NSCoder固化机制,将对象保存在文件中
  3.经过SQlite或CoreData保存在文件数据库中

 

 

1四、Object-C有私有方法吗?私有变量呢?

答案:

  objective-c– 类里面的方法只有两种, 静态方法和实例方法. 这彷佛就不是完整的面向对象了,按照OO的原则就是一个对象

  只暴露有用的东西. 若是没有了私有方法的话,对于一些小范围的代码重用就不那么顺手了. 在类里面声名一个私有方法

复制代码
1 @interface Controller : NSObject { NSString *something; } 2 + (void)thisIsAStaticMethod; 3 – (void)thisIsAnInstanceMethod; 4 @end 5 @interface Controller (private) - 6 (void)thisIsAPrivateMethod; 7 @end
复制代码

  @private能够用来修饰私有变量
  在Objective‐C中,全部实例变量默认都是私有的,全部实例方法默认都是公有的

 

1五、关键字const什么含义?

答案:

  const意味着”只读”,下面的声明都是什么意思?
  const int a;
  int const a;
  const int *a;
  int * const a;
  int const * a const;

  前两个的做用是同样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针能够)

    第四个意思a是一个 指向整型数的常指针(也就是说,指  针指向的整型数是能够修改的,但指针是不可修改的)。最后一个意味

  着a是一个指向常整型数的常指针(也就是说,指针指向 的整型数是不可修改的,同时指针也是不可修改的)。

  结论:
  关键字const的做用是为给读你代码的人传达很是有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的

  若是你曾花不少时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(固然,懂得用const的程序员不多会留下的

  垃圾让别人来清理的。)经过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。合理地使用关键字const

  可使编译器很天然地保护那些不但愿被改变的参数,防止其被无心的代码修改。简而言之,这样能够减小bug的出现。

  欲阻止一个变量被改变,可使用 const 关键字。在定义该const 变量时,一般须要对它进行初始化,由于之后就没有机会再

  去改变它了;


  2)对指针来讲,能够指定指针自己为const,也能够指定指针所指的数据为 const,或两者同时指定为const;


  3)在一个函数声明中,const能够修饰形参,代表它是一个输入参数,在函数内部不能改变其值;


  4)对于类的成员函数,若指定其为const 类型,则代表其是一个常函数,不能修改类的成员变量;


  5)对于类的成员函数,有时候必须指定其返回值为const 类型,以使得其返回值不为“左值”。

 

1六、关键字volatile有什么含义?并给出三个不一样例子?

答案:

  一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,

  优化器在用到这个变量时必须每次都当心地从新读取这个变量的值,而不是使用保存在寄存器里的备份。

  下面是volatile变量的几个例子:
  1) 并行设备的硬件寄存器(如:状态寄存器)
  2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
  3)多线程应用中被几个任务共享的变量

 

1七、一个参数既能够是const还能够是volatile吗?解释为何。

答案:

  是的。一个例子是只读的状态寄存器。它是volatile由于它可能被意想不到地改变。它是const由于程序不该该试图去修改它。

 

1八、 一个指针能够是volatile 吗?解释为何。

答案:
  能够是的。

  尽管这种状况并不常见,但它仍是能够。一个例子就是:

  当一个中断服务子程序企图去修改一个指向一个buffer指针的时候。

 

1九、static有什么做用?

答案:

  1)函数体内 static 变量的做用范围为该函数体,不一样于 auto 变量,该变量的内存只被分配一次,所以其值在下次调用时

  仍维持上次的值;
  2)在模块内的 static 全局变量能够被模块内所用函数访问,但不能被模块外其它函数访问;
  3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
  4)在类中的 static 成员变量属于整个类所拥有,对类的全部对象只有一份拷贝;
  5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,于是只能访问类的static 成员变量。

 

20、#import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别?

答案:
  #import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字, 使用#import头文件会自动

  只导入一次,不会重复导入,至关于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,

  才去查看类的实现文件,能够解决头文件的相互包含;#import<>用来包含系 统的头文件,#import””用来包含用

  户头文件。

 

2一、线程和进程的区别?

答案:

  进程和线程都是由操做系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的主要差异

  在于它们是不一样的操做系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,

  而线程只是一 个进程中的不一样执行路  径。线程有本身的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就

  等于整个进程死掉,因此多进程的程序要比多线程的程 序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求

  同时进行而且又要共享某些变量的并发操做,只能用线程,不能用进程。

 

2二、堆和栈的区别?

答案:

  管理方式:对于栈来说,是由编译器自动管理,无需咱们手工控制;对于堆来讲,释放工做由程序员控制,容易产生memoryleak。
  申请大小:
  栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统

  预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就肯定的常数),若是申请的空间超过栈的

  余空间时,将提示overflow。因 此,能从栈得到的空间较小。
  堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是因为系统是用链表来存储的空闲内存地址的,天然是不连续的,

  而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。因而可知,堆得到的空间比较灵活,

  也比较大。
  碎片问题:对于堆来说,频繁的new/delete势必会形成内存空间的不连续,从而形成大量的碎片,使程序效率下降。对于栈来说,

  则不会存在这个问题,由于栈是先进后出的队列,他们是如此的一一对应,以致于永远都不可能有一个内存块从栈中间弹出
  分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,好比局部

  变量的分配。动态分配由alloca函数进行分配,可是栈的动态分配和堆是不一样的,他的动态分配是由编译器进行释放,无需咱们

  手工实现。
  分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的

  指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。

 

2三、介绍一下Object-C的内存管理机制?

答案:

  1)当你使用new,alloc和copy方法建立一个对象时,该对象的保留计数器值为1.当你再也不使用该对象时,你要负责向该对象发送一条

  release或autorelease消息.这样,该对象将在使用寿命结束时被销毁.
  2)当你经过任何其余方法得到一个对象时,则假设该对象的保留计数器值为1,并且已经被设置为自动释放,你不须要执行任何操做来

   确保该对象被清理.若是你打算在一段时间内拥有该对象,则须要保留它并确保在操做完成时释放它.
  3)若是你保留了某个对象,你须要(最终)释放或自动释放该对象.必须保持retain方法和release方法的使用次数相等.为何不少

  内置的类,如TableViewController的delegate的属性是assign不是retain。

  循环引用
  全部的引用计数系统,都存在循环应用的问题。例以下面的引用关系:
     1)对象a建立并引用到了对象b.
     2)对象b建立并引用到了对象c.
     3)对象c建立并引用到了对象b.
  这时候b和c的引用计数分别是2和1。当a再也不使用b,调用release释放对b的全部权,由于c还引用了b,因此b的引用计数为1,

  b不会被释放。b不释放,c的引用计数就是1,c也不会被释放。今后,b和c永远留在内存中。这种状况,必须打断循环引用

  经过其余规则来维护引用关系。好比,咱们常见的delegate每每是assign方式的属性而不是retain方式 的属性,

  赋值不会增长引用计数,就是为了防止delegation两端产生没必要要的循环引用。若是一个UITableViewController对象a

  经过retain获取了UITableView对象b的全部权,这个UITableView对象b的delegate又是a,若是这个delegate是retain方式的,

  那基本上就没有机会释放这两个对象了。本身在设计使用delegate模式时,也要注意这点。

 

2四、定义属性时,什么状况使用copy、assign、retain?

答案:  

  assign用于简单数据类型,如NSInteger,double,bool,
  retain和copy用于对象,
  copy用于当a指向一个对象,b也想指向一样的对象的时候,若是用assign,a若是释放,再调用b会crash,若是用copy 的方式,

  a和b各自有本身的内存,就能够解决这个问题。retain 会使计数器加一,也能够解决assign的问题。
  另外:atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操做。在多线程环境下,原子操做是必要的,

  不然有可能引发错误的结果。加了atomic,setter函数会变成下面这样: 

 if (property != newValue) {    [property release];    property = [newValue retain];  }

 

2五、对象是何时被release的?

答案:

  引用计数为0时。 autorelease实际上只是把对release的调用延迟了,对于每个Autorelease,系统只是把该Object放入

  了当前的 Autoreleasepool中,当该pool被释放时,该pool中的全部Object会被调用Release。对于每个Runloop,

  系统会隐式建立一个Autoreleasepool,这样全部的release pool会构成一个象CallStack同样的一个栈式结构,

  在每个Runloop结束时,当前栈顶的Autoreleasepool会被销毁,这样这 个pool里的每一个Object

  (就是autorelease的对象)会被release。那什么是一个Runloop呢?一个UI事件,Timercall, delegate call,

   都会是一个新的Runloop

 

2六、iOS有没有垃圾回收机制?

答案:

  Objective-C 2.0也是有垃圾回收机制的,可是只能在Mac OS X Leopard10.5 以上的版本使用。

 

2七、介绍一下tableView的重用机制?

答案:

  查看UITableView头文件,会找到NSMutableArray*  visiableCells,和NSMutableDictnery* reusableTableCells两个结构。

  visiableCells内保存当前显示的cells,reusableTableCells保存可重 用的cells。

  TableView显示之初,reusableTableCells为空,那么 tableViewdequeueReusableCellWithIdentifier:CellIdentifier返回nil。

  开始的cell都是 经过[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]

  来建立,并且cellForRowAtIndexPath只是调用最大显示cell数的 次数。好比:有100条数据,iPhone一屏最多显示10个cell。

  程序最开始显示TableView的状况是:

  1. 用[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]建立10次cell,

  并给cell指定一样的重用标识(固然,能够为不一样显示类型的 cell指定不一样的标识)。而且10个cell所有都加入到visiableCells数组,

  reusableTableCells为空。

  2. 向下拖动tableView,当cell1彻底移出屏幕,而且cell11(它也是alloc出来的,缘由同上)彻底显示出来的时候。cell11加入到

   visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。

  3. 接着向下拖动tableView,由于reusableTableCells中已经有值,因此,当须要显示新的 cell,cellForRowAtIndexPath再次

  被调用的候,tableViewdequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。 cell1加入到visiableCells,

  cell1移出reusableTableCells;cell2移出 visiableCells,cell2加入到reusableTableCells。以后再须要显示的Cell就能够

  正常重用了。


2八、ViewController 的loadView、viewDidLoad、viewDidUnload分别是何时调用的,在自定义

  ViewCointroller时在这几个函数中应该作什么工做?

答案:

  由init、loadView、viewDidLoad、viewDidUnload、dealloc的关系提及
  1)init方法

  在init方法中实例化必要的对象(听从LazyLoad思想)
  init方法中初始化ViewController自己

  2)loadView方法
  当view须要被展现而它倒是nil时,viewController会调用该方法。不要直接调用该方法。
  若是手工维护views,必须重载重写该方法
  若是使用IB维护views,必须不能重载重写该方法

  3)loadView和IB构建view
  你在控制器中实现了loadView方法,那么你可能会在应用运行的某个时候被内存管理控制调用。 若是设备内存不足的时候,

   view 控制器会收到didReceiveMemoryWarning的消息。默认的实现是检查当前控制器的view是否在使用。 若是它的view

  不在当前正在使用的view hierarchy里面,且你的控制器实现了loadView方法,那么这个view将被release, loadView方法

  将被再次调用来建立一个新的view。

  4)viewDidLoad方法
  viewDidLoad 此方法只有当view从nib文件初始化的时候才被调用。
  重载重写该方法以进一步定制view
  在iPhone OS 3.0及以后的版本中,还应该重载重写viewDidUnload来释放对view的任何索引
  viewDidLoad后调用数据Model

  5)viewDidUnload方法
  当系统内存吃紧的时候会调用该方法(注:viewController没有被dealloc)
  内存吃紧时,在iPhone OS 3.0以前didReceiveMemoryWarning是释放无用内存的惟一方式,可是OS 3.0及之后

  viewDidUnload方法是更好的方式在该方法中将全部IBOutlet(不管是property仍是实例变量)置为nil

  (系统release view时已经将其release掉了)在该方法中释放其余与view有关的对象、其余在运行时建立

  (但非系统必须)的对象、在viewDidLoad中被建立的对象、缓存数据等 release对象后,将对象置为nil(IBOutlet只须要将

  其置为nil,系统release view时已经将其release掉了)通常认为viewDidUnload是viewDidLoad的镜像,由于当view被从新

  请求时,viewDidLoad还会从新被执行viewDidUnload中被release的对象必须是很容易被从新建立的对象(好比在

  viewDidLoad或其余方法中建立的对象),不要release用户数据或其余很难被从新建立的对象

  6)dealloc方法
  viewDidUnload和dealloc方法没有关联,dealloc仍是继续作它该作的事情  

 

2九、ViewController的didReceiveMemoryWarning是在何时调用的?默认的操做是什么?

答案:

  当程序接到内存警告时View Controller将会收到这个消息:didReceiveMemoryWarning从iOS3.0开始,不须要重载这个函数,

  把释放内存的代码放到viewDidUnload中去。这个函数的默认实现是:检查controller是否能够安全地释放它的view(这里加粗的

  view指的是controller的view属性),好比view自己没有superview而且能够被很容易地重建(从nib或者loadView函数)。

  若是view能够被释放,那么这个函数释放view并调用viewDidUnload。你能够重载这个函数来释放controller中使用的其余内存。

  但要记得调用这个函数的super实现来容许父类(通常是UIVIewController)释放view。若是你的ViewController保存着

  view的子view的引用,那么,在早期的iOS版本中,你应该在这个函数中来释放这些引用。而在iOS3.0或更高版本中,

  你应该在viewDidUnload中释放这些引用。

 

30、列举Cocoa中常见的集中多线程的实现,并谈谈多线程安全的几种解决办法,通常什么地方会用到多线程?

答案:

  NSOperation NSThread
  @sychonized 通常须要作多任务的处理时会用的多线程。

 

3一、怎么理解MVC,在OC中MVC是怎么实现的?

答案:

  MVC设计模式考虑三种对象:模型对象、视图对象、和控制器对象。模型对象表明特别的知识和专业技能,它们负责保有应用程序

  的数据和定义操做数据的 逻辑。视图对象知道如何显示应  用程序的模型数据,并且可能容许用户对其进行编辑。控制器对象

  是应用程序的视图对象和模型对象之间的协调者。

 

3二、delegate和notification区别,分别在什么状况下使用?

答案:

  delegate针对one-to-one关系,而且reciever能够返回值给sender;

  notification 能够针对one-to-one/many/none,reciever没法返回值给sender;

  因此,delegate用于sender但愿接受到reciever的某个功能反馈值,notification用于通知多个object某个事件。

 

3三、谈谈对KVC(Key-Value-Coding)与KVO(Key-Value-Observing)(键-值-编码 与 键-值-监看)的理解?

答案:

  当经过KVC调用对象时,好比:[self valueForKey:@”someKey”]时,程序会自动试图经过几种不一样的方式解析这个调用。

  首先查找对象是否带有 someKey 这个方法,若是没找到,会继续查找对象是否带有someKey这个实例变量(iVar),

  若是尚未找到,程序会继续试图调用 -(id)valueForUndefinedKey:这个方法。若是这个方法仍是没有被实现的话,

  程序会抛出一个 NSUndefinedKeyException异常错误。(Key-Value Coding查找方法的时候,不只仅会查找someKey

  这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及 _getsomeKey这几种形式。同时,

  查找实例变量的时候也会不只仅查找someKey这个变量,也会查找_someKey这个变量是否存在。)设计valueForUndefinedKey:

  方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象可以在错误发生前,有最后的机会响应这个请求。

 

3四、self.跟self的区别是什么?

答案:

  self. 表示对象的属性 self 表示对象自己

 

3五、id、nil分别表明什么?

答案: 

  1)id和void *并不是彻底同样。在上面的代码中,id是指向struct objc_object的一个指针,这个意思基本上是说,id是一个指向任何

  一个继承了Object(或者NSObject)类的对象。须要注意的是id 是一个指针,因此你在使用id的时候不须要加星号。

  好比id foo=nil定义了一个nil指针,这个指针指向NSObject的一个任意子类。而id *foo=nil则定义了一个指针,这个

  指针指向另外一个指针,被指向的这个指针指向NSObject的一个子类。 

  2)nil和C语言的NULL相同,在objc/objc.h中定义。nil表示一个Objctive-C对象,这个对象的指针指向空(没有东西就是空)。

 

3六、内存管理 Autorelease、retain、copy、assign的set方法和含义?

答案:

  1)你初始化(alloc/init)的对象,你须要释放(release)它。例如:

    NSMutableArray aArray = [[NSArray alloc] init];

  后,须要

  [aArray release];

  2)你retain或copy的,你须要释放它。例如:

  [aArray retain]

  后,须要

  [aArray release];

  3)被传递(assign)的对象,你须要斟酌的retain和release。例如:

  obj2 = [[obj1 someMethod] autorelease];

  对象2接收对象1的一个自动释放的值,或传递一个基本数据类型(NSInteger,NSString)时: 你或但愿将对象2进行retain,

  以防止它在被使用以前就被自动释放掉。可是在retain后,必定要在适当的时候进行释放。

 

3七、谈谈你对于索引计数的理解?

答案:

  retain值 = 索引计数(ReferenceCounting) NSArray对象会retain(retain值加一)任何数组中的对象。当NSArray被卸载

  (dealloc)的时候,全部数组中的对象会被执行一次释放(retain值减一)。不只仅是NSArray,任何收集类 (CollectionClasses)

  都执行相似操做。例如NSDictionary,甚至UINavigationController。Alloc/init创建的对象,索引计数为1。无需将其再次retain

  [NSArray array]和[NSDate date]等“方法”创建一个索引计数为1的对象,可是也是一个自动释放对象因此是本地临时对象,

  那么无所谓了。若是是打算在全Class中使用的变量(iVar),则必须retain它。缺省的类方法返回值都被执行了“自动释放”方法。

  (*如上中的NSArray)在类中的卸载方法“dealloc”中,release全部未被平衡的NS对象。(*全部未被autorelease,

  而retain值为1的)

 

3八、类别的做用是什么?

答案:

  有时咱们须要在一个已经定义好的类中增长一些方法,而不想去重写该类。好比,当工程已经很大,代码量比较多,或者类中

  已经包住不少方法,已经有其余代码调用了该类建立对象并使用该类的方法时,可使用类别对该类扩充新的方法。注意:

  类别只能扩充方法,而不能扩充成员变量。

 

3九、什么是委托(举例)?

答案:

  委托代理(degegate),顾名思义,把某个对象要作的事情委托给别的对象去作。那么别的对象就是这个对象的代理,代替它

  来打理要作的事。反映到程序中,首先要明确一个对象的委托  方是哪一个对象,委托所作的内容是什么。委托机制是一种设计

  模式,在不少语言中都用到的,这只是个通用的思想,网上会有不少关于这方面的介绍。那么在苹果开发过程当中,用到委托的

  程序实现思想以下,我主要拿如何在视图之间传输信息作个例子。譬如:在两个页面(UIIview视图对象)实现传值,

  用委托(delegate)能够很好作到!
  方法:
     

复制代码
 1 //类A  2 @interface A:UIView  3 id transparendValueDelegate;  4  @property(nomatic, retain) idtransparendValueDelegate;  5 @end  6  7 @implemtion A  8 @synthesize transparendValueDelegate  9 -(void)Function 10 { 11 NSString* value = @"hello"; 12 //让代理对象执行transparendValue动做 13  [transparendValueDelegate transparendValue:value]; 14 } 15 @end 16 17 //类B 18 @interface B:UIView 19 NSString* value; 20 @end 21 22 @implemtion B 23 -(void)transparendValue:(NSString*)fromValue 24 { 25 value = fromValue; 26 NSLog(@"the value is %@",value); 27 } 28 @end 29 30 //下面的设置A代理委托对象为B 31 //在定义A和B类对象处: 32 33 A* a = [[A alloc] init]; 34 B* b = [[B alloc] init]; 35 a. transparendValueDelegate = b;//设置对象a代理为对象b
复制代码

   这样在视图A和B之间能够经过委托来传值!

  下面这个例子委托有两类:
  一、一个视图类对象的代理对象为父视图,子视图用代理实现让父视图显示别的子视图
  二、同一父视图下的一个子视图为另外一个子视图的代理对象,让另外一个子视图改变自身背景色为给定的颜色
  ===============================================
  规范格式以下:

复制代码
 1 @protocol TransparendValueDelegate;  2  3 @interface A:UIView  4 id< TransparendValueDelegate > m_dTransparendValueDelegate;  5 @property(nomatic, retain) id m_dTransparendValueDelegate;  6 @end  7 //代理协议的声明  8 @protocol TransparendValueDelegat<NSObject>  9 { 10 -(void)transparendValue:(NSString*)fromValue; 11 12 }
复制代码

 

 

40、frame 和 bounds 的区别 ,bound的大小改变frame 改变吗?

答案:

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

  bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统)

 

4一、异步请求最大数目是多大,为何只能这么多?

答案:

       这个数量是跟cpu有关的,并发性取决于cpu核数,每一个核只能 同时处理一个任务.4核cpu理论上能够并发处理4个任务,

  若是按http来算就是4个请求,可是cpu是抢占式资源,因此通常来讲并发量是要根据任务的 耗时和cpu的繁忙度来计算4个左右

  只是个经验值你开10个短耗时的任务和几个长耗时任务的效率是不一样的- -..通常来讲估算这个量的最大效率估算公示是cpu

  核数*2-1,这个公式是当时对集群进行压测获得的结论.cpu抢占时间跟任务时长…开启这个数量的 线程能够最大化的榨干cpu

  一个道理。cpu不可能都被抢去作connection.iOS是cpu密集型的消耗?。这个大概知道就好了,也不会有人特 别在乎吧…

  cpu核数*2-1那个是作淘宝的java团队压测获得的线程最优数?,放在iOS上也多少适用…通常来讲不超过这个量就好,

  线程不是起的越多越好,线程数就是…cpu来决定的

4二、 什么是coredata?

答案:

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

4三、 什么是NSManagedObject模型?

答案:

  NSManagedObject是NSObject的子类 ,也是coredata的重要组成部分,它是一个通用的类,实现了

  core data 模型层所需的基本功能,用户可经过子类化NSManagedObject,创建本身的数据模型。

 

4四、 什么是NSManagedobjectContext ?

答案:

  NSManagedobjectContext对象负责应用和数据库之间的交互。

 

4五、何时使用NSMutableArray,何时使用NSArray?

答案:

  当数组在程序运行时,须要不断变化的,使用NSMutableArray,当数组在初始化后,便再也不改变的,使用NSArray。

  须要指出的是,使用NSArray只代表的是该数组在运行  时不发生改变,即不能往NSAarry的数组里新增和删除元素,

  但不代表其数 组內的元素的内容不能发生改变。NSArray是线程安全的,NSMutableArray不是线程安全的,

  多线程使用到NSMutableArray需 要注意。

相关文章
相关标签/搜索