1. #import
跟#include 又什么差别,@class呢, #import<> 跟 #import””又什么差别?

  答:#import是Objective-C导入头文件的keyword。#include是C/C++导入头文件的keyword,使用#import头文件会自己主动仅仅导入一次,不会反复导入,相当于#include和#pragma
once;@class告诉编译器某个类的声明,当运行时,才去查看类的实现文件,能够解决头文件的相互包括;#import<>用来包括系统的头文件,#import””用来包括用户头文件。





  2. 属性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

 
     3.
 Object-c的类能够多重继承么?能够实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?

  答: Object-c的类不能够多重继承;能够实现多个接口,通过实现多个接口能够完毕C++的多重继承;Category是类别,普通情况用分类好,用Category去重写类的方法,仅对本Category有效。不会影响到其它类与原有类的关系。

  4.写一个setter方法用于完毕@property (nonatomic,retain)NSString
*name,写一个setter方法用于完毕@property(nonatomic。copy)NSString *name

  - (void) setName:(NSString*) str

  {

  [str retain];

  [name release];

  name = str;

  }

  - (void)setName:(NSString *)str

  {

  id t = [str copy];

  [name release];

  name = t;

  }





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

  编译时是NSString的类型;执行时是NSData类型的对象





  6.常见的object-c的数据类型有那些。 和C的基本数据类型有什么差别?

如:NSInteger和int

  object-c的数据类型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等。这些都是class,创建后便是对象,而C语言的基本数据类型int,仅仅是一定字节的内存空间。用于存放数值;NSInteger是基本数据类型,并非NSNumber的子类。当然也不是NSObject的子类。NSInteger是基本数据类型Int或者Long的别名(NSInteger的定义typedef
long NSInteger),它的差别在于。NSInteger会依据系统是32位还是64位来决定是本身是int还是Long。





  7.id 声明的对象有什么特性?

  Id 声明的对象具有执行时的特性。即能够指向随意类型的objcetive-c的对象;





  8.Objective-C怎样对内存管理的,说说你的看法和解决方法?

  Objective-C的内存管理主要有三种方式ARC(自己主动内存计数)、手动内存计数、内存池。

  1. (Garbage Collection)自己主动内存计数:这样的方式和java类似,在你的程序的运行过程中。始终有一个高人在背后准确地帮你收拾垃圾。你不用考虑它什么时候開始工作。如何工作。你仅仅须要明确。我申请了一段内存空间。当我不再使用从而这段内存成为垃圾的时候,我就彻底的把它忘记掉。反正那个高人会帮我收拾垃圾。遗憾的是。那个高人须要消耗一定的资源,在携带设备里面。资源是紧俏商品所以iPhone不支持这个功能。

所以“Garbage
Collection”不是本入门指南的范围,对“Garbage Collection”内部机制感兴趣的同学能够參考一些其它的资料。只是说老实话“Garbage Collection”不大适合适刚開始学习的人研究。

  解决: 通过alloc – initial方式创建的, 创建后引用计数+1, 此后每retain一次引用计数+1, 那么在程序中做对应次数的release就好了.

  2. (Reference Counted)手动内存计数:就是说。从一段内存被申请之后。就存在一个变量用于保存这段内存被使用的次数,我们临时把它称为计数器。当计数器变为0的时候,那么就是释放这段内存的时候。

比方说,当在程序A里面一段内存被成功申请完毕之后。那么这个计数器就从0变成1(我们把这个过程叫做alloc),然后程序B也须要使用这个内存。那么计数器就从1变成了2(我们把这个过程叫做retain)。紧接着程序A不再须要这段内存了,那么程序A就把这个计数器减1(我们把这个过程叫做release);程序B也不再须要这段内存的时候,那么也把计数器减1(这个过程还是release)。当系统(也就是Foundation)发现这个计数器变成了0。那么就会调用内存回收程序把这段内存回收(我们把这个过程叫做dealloc)。顺便提一句。假设没有Foundation,那么维护计数器,释放内存等等工作须要你手工来完毕。

  解决:通常是由类的静态方法创建的, 函数名中不会出现alloc或init字样, 如[NSString string]和[NSArray arrayWithObject:], 创建后引用计数+0, 在函数出栈后释放,
即相当于一个栈上的局部变量. 当然也能够通过retain延长对象的生存期.

  3. (NSAutoRealeasePool)内存池:能够通过创建和释放内存池控制内存申请和回收的时机.

  解决:是由autorelease增加系统内存池, 内存池是能够嵌套的, 每一个内存池都须要有一个创建释放对, 就像main函数中写的一样. 使用也非常easy, 比方[[[NSString alloc]initialWithFormat:@”Hey
you!”] autorelease], 即将一个NSString对象增加到最内层的系统内存池, 当我们释放这个内存池时, 当中的对象都会被释放.





  9. 原子(atomic)跟非原子(non-atomic)属性有什么差别?

  1. atomic提供多线程安全。

是防止在写未完毕的时候被另外一个线程读取。造成数据错误

  2. non-atomic:在自己管理内存的环境中。解析的訪问器保留并自己主动释放返回的值,假设指定了 nonatomic ,那么訪问器仅仅是简单地返回这个值。





  10. 看以下的程序,第一个NSLog会输出什么?

这时str的retainCount是多少?

第二个和第三个呢?
为什么?

  =======================================================

  NSMutableArray* ary = [[NSMutableArray array] retain];

  NSString *str = [NSString stringWithFormat:@"test"];

  [str retain];

  [aryaddObject:str];

  NSLog(@”%@%d”,str,[str retainCount]);

  [strretain];

  [strrelease];

  [strrelease];

  NSLog(@”%@%d”,str,[str retainCount]);

  [aryremoveAllObjects];

  NSLog(@”%@%d”,str,[str retainCount]);

  =======================================================

  str的retainCount创建+1,retain+1,增加数组自己主动+1 3

  retain+1。release-1,release-1 2

  数组删除全部对象,全部数组内的对象自己主动-1 1





  11. 内存管理的几条原则时什么?依照默认法则.那些keyword生成的对象

  须要手动释放?在和property结合的时候如何有效的避免内存泄露?

  谁申请,谁释放

  遵循Cocoa Touch的使用原则;

  内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”须要注意@property设置特性时,一定要用对特性keyword。对于“内存泄漏”,一定要申请了要负责释放,要细心。

  keywordalloc 或new 生成的对象须要手动释放;

  设置正确的property属性,对于retain须要在合适的地方释放。





  12.怎样对iOS设备进行性能測试?

  Profile-> Instruments ->Time Profiler





  13. Object C中创建线程的方法是什么?

假设在主线程中运行代码。方法是什么?假设想延时运行代码、方法又是什么?

  线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其增加NSOperationQueue;在主线程运行代码,方法是performSelectorOnMainThread,假设想延时运行代码能够用performSelector:onThread:withObject:waitUntilDone:





  14.描写叙述一下iOS SDK中怎样实现MVC的开发模式

MVC是Model-VIew-Controller,就是模型-视图-控制器, MVC把软件系统分为三个部分:Model,View,Controller。

在cocoa中,你的程序中的每个object(对象)都将明显地仅属于这三部分中的一个。而全然不属于另外两个。model数据模型。view是对这些数据的显示,viewcontroller就是把model拿到view中显示。起到model和view之间桥梁的作用。MVC能够帮助确保帮助实现程序最大程度的可重用性。

各MVC元素彼此独立运作,通过分开这些元素,能够构建可维护。可独立更新的程序组建, 提高代码的重用性.

  15 浅复制和深复制的差别?

  答案:浅层复制:仅仅复制指向对象的指针。而不复制引用对象本身。

  深层复制:复制引用对象本身。

  意思就是说我有个A对象。复制一份后得到A_copy对象后,对于浅复制来说。A和A_copy指向的是同一个内存资源,复制的仅仅只是是是一个指针,对象本身资源

  还是仅仅有一份。那假设我们对A_copy运行了改动操作,那么发现A引用的对象相同被改动,这事实上违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了

  两份独立对象本身。

  16. 类别的作用?继承和类别在实现中有何差别?

  答案:category 能够在不获悉,不改变原来代码的情况下往里面加入新的方法,仅仅能加入,不能删除改动。

  而且假设类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法。由于类别具有更高的优先级。

  类别主要有3个作用:

  (1)将类的实现分散到多个不同文件或多个不同框架中。

  (2)创建对私有方法的前向引用。

  (3)向对象加入非正式协议。

  继承能够添加,改动或者删除方法,而且能够添加属性。





  17. 类别和类扩展的差别。

  答案:category和extensions的不同在于 后者能够加入属性。

另外后者加入的方法是必需要实现的。

  extensions能够觉得是一个私有的Category。





  18. 什么是KVO和KVC?

  答案:kvc:键 – 值编码是一种间接訪问对象的属性使用字符串来标识属性。而不是通过调用存取方法。直接或通过实例变量訪问的机制。

  非常多情况下能够简化程序代码。apple文档事实上给了一个非常好的样例。

  kvo:键值观察机制。他提供了观察某一属性变化的方法,极大的简化了代码。

  详细用看到嗯哼用到过的一个地方是对于button点击变化状态的的监控。

  比方我自己定义的一个button

  [self addObserver:self forKeyPath:@"highlighted" options:0 context:nil];

  #pragma mark KVO

  - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void
*)context

  {

  if ([keyPath isEqualToString:@"highlighted"] ) {

  [self setNeedsDisplay];

  }

  }

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

  对于kvc机制怎样通过key寻找到value:

  “当通过KVC调用对象时。比方:[self valueForKey:@”someKey”]时,程序会自己主动试图通过几种不同的方式解析这个调用。首先查找对象是否带有 someKey 这种方法,假设没找到。会继续查找对象是否带有someKey这个实例变量(iVar),假设还没有找到,程序会继续试图调用
-(id) valueForUndefinedKey:这种方法。假设这种方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。

  (cocoachina.com注:Key-Value Coding查找方法的时候。不只会查找someKey这种方法。还会查找getsomeKey这种方法,前面加一个get。或者_someKey以及_getsomeKey这几种形式。

同一时候。查找实例变量的时候也会不只查找someKey这个变量,也会查找_someKey这个变量是否存在。)

  设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时。对象可以在发生错误前。有最后的机会响应这个请求。这样做有非常多优点。以下的两个样例说明了这样做的优点。



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

  由于我们知道button却是存在一个highlighted实例变量.因此为何上面我们仅仅是add一个相关的keypath即可了。

  能够依照kvc查找的逻辑理解,就说的过去了。





  19. 代理的作用?

  答案:代理的目的是改变或传递控制链。

同意一个类在某些特定时刻通知到其它类,而不须要获取到那些类的指针。

能够降低框架复杂度。

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

  20. oc中可改动和不能够改动类型。

  答案:可改动不可改动的集合类。

这个我个人简单理解就是可动态加入改动和不可动态加入改动一样。

  比方NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的。后者能够加入等,能够动态申请新的内存空间。

【面试】iOS 开发面试题(一)的更多相关文章

  1. 100个iOS开发面试题汇总-王刚韧的技术博客

    100个iOS开发面试题汇总 关于iOS开发面试,不管对于招聘和应聘来说,面试都是很重要的一个环节,特别对于开发者来说,面试中的技术问题环节不仅是企业对应聘者技能和积累的考察,也是一个开发者自我检验的 ...

  2. 100个iOS开发面试题汇总

    100个iOS开发面试题汇总 关于iOS开发面试,不管对于招聘和应聘来说,面试都是很重要的一个环节,特别对于开发者来说,面试中的技术问题环节不仅是企业对应聘者技能和积累的考察,也是一个开发者自我检验的 ...

  3. 【面试】iOS 开发面试题(二)

    1. 我们说的oc是动态执行时语言是什么意思? 答案:多态. 主要是将数据类型的确定由编译时,推迟到了执行时. 这个问题事实上浅涉及到两个概念.执行时和多态. 简单来说.执行时机制使我们直到执行时才去 ...

  4. 百度ios 开发面试题

    百度移动云可穿戴部门的面试经历,面试官都非常热情友好,一上来到弄的我挺不好意思的.下面记录一下自己的面试过程,因为我真的没啥面试经验,需要总结下. 1面 Objective C runtime lib ...

  5. iOS开发面试题整理

    前言 本文借鉴整理了iOS高级开发常见的面试题,并且分博客一一分析,希望能和大家一起进步学习. 欢迎大家关注我的 Github

  6. iOS开发面试题(中级)

    //想面试的童鞋们来看看自己会多少, 老鸟可以无视直接绕过...1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?与Ex ...

  7. iOS开发面试题整理 (三)

    1. 风格纠错题 修改完的代码: typedef NS_ENUM(NSInteger, CYLSex) { CYLSexMan, CYLSexWoman }; @interface CYLUser : ...

  8. 中级iOS开发面试题

    1:MVC的理解 MVC设计模式考虑三种对象:数据模型对象,视图对象和控制器对象. 数据模型:负责存储.定义.操作数据: 视图:展示数据给用户,和用户进行操作交互: 控制器:M与V的协调者,控制获取数 ...

  9. iOS开发面试题整理(二)

    8 类别的作用?继承和类别在实现中有何区别? 答案:category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改. 并且如果类别和原来类中的方法产生名称冲突,则类别 ...

随机推荐

  1. 华硕笔记本无法设置U盘启动,快捷启动不能识别

    最近有不少华硕笔记本用户朋友在使用U大侠装系统时,不管是使用快捷键启动还是BIOS查看,都没有发现U盘启动项,这该怎么办呢?   不要急,既然找不到启动项,那就从设置启动项来解决不就可以了. 第一种方 ...

  2. pep8摘要

    https://www.python.org/dev/peps/pep-0008/ #!/usr/bin/python # -*- coding:utf- -*- # @filename: pep_s ...

  3. LOJ 2321 清华集训2017 无限之环 拆点+最小费用最大流

    题面:中文题面,这里不占用篇幅 分析: 看到题面,我就想弃疗…… 但是作为任务题单,还是抄了题解…… 大概就是将每个格子拆点,拆成五个点,上下左右的触点和一个负责连源汇点的点(以下简称本点). 这个这 ...

  4. [GXOI/GZOI2019]与或和(单调栈)

    想了想决定把这几题也随便水个解题报告... bzoj  luogu 思路: 首先肯定得拆成二进制30位啊 此后每一位的就是个01矩阵 Q1就是全是1的矩阵个数 Q2就是总矩阵个数减去全是0的矩阵个数 ...

  5. js 技巧 (十)广告JS代码效果大全 【1】

    广告JS代码效果大全 1.[普通效果]     现在很多网站广告做的如火如荼,现在我就来介绍一下常见的对联浮动广告效果的代码使用方法,介绍的这种效果,在1024*768分辨率下正常显示,在800*60 ...

  6. Python中的列表(5)

    1.使用函数 range() 创建一个数字列表 for value in range(1,5): print(value) console: 我们发现,它并不会打印数字5,因为 range() 函数, ...

  7. Codeforces Round #352 (Div. 2),A题与B题题解代码,水过~~

    ->点击<- A. Summer Camp time limit per test 1 second memory limit per test 256 megabytes input s ...

  8. 1004. 成绩排名 (20) (快速排序qsort函数的使用问题)

    读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生 ...

  9. [luoguP2617] Dynamic Ranking(树状数组 套 主席树 + 离散化)

    传送门 BZOJ上是权限题,洛谷赞啊. 求区间 K 大数很简单. 但是如果修改某个数的话,那么就得把这个数及后面所建的主席树都更新一遍 nlogn,显然不行. 所以可以在外面套一个树状数组来优化,树状 ...

  10. 2018/3/14 Hadoop学习笔记(一)

    首先,什么是Hadoop?为什么它是现在大数据处理最热门的框架呢?(正确来说,现在Hadoop是一个生态圈) Hadoop是apache下一套开源的服务框架,它主要的作用就是利用服务器集群,来对海量数 ...