1.回答person的retainCount值,并解释为什么

Person * per = [[Person alloc] init]; 此时person 的retainCount的值是1
self.person = per;

在self.person 时,如果是assign,person的 retainCount的值不变,仍为1 若是:retain,person的retainCount的值加1,变为2。若是:copy person的retainCount值不变,仍为1。

2.这段代码有什么问题

@implementation Person
- (void)setAge:(int)newAge { 
    self.age = newAge; 
} 
@end

会死循环,会重复调用自己!self.age 改为_age即可; 并且书写不规范:setter方法中的newAge应该为age

3.这段代码有什么问题,如何修改

for (int i = 0; i < 100; i++) {
   NSString *string = @"xiaomeng";
   string = [string lowercaseString];
   string = [string stringByAppendingString:@"xyz"];
   NSLog(@"%@", string);
}

会出现内存泄露,修改之后:

for (int i = 0; i < 100; i++) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSString *string = @"xiaomeng";
    string = [string lowercaseString];
    string = [string stringByAppendingString:@"xyz"];
    NSLog(@"%@", string);
    [pool drain];
}

补充:
使用容器的block版本的枚举器时,内部会自动添加一个AutoreleasePool:

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    // 这里被一个局部@autoreleasepool包围着
}];

在普通for循环和for in循环中没有,所以,block版本枚举器更加方便。for循环中遍历产生大量autorelease变量时,就需要手加局部AutoreleasePool了。

延伸:堆栈的区别:

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

(2)申请大小:能从栈获得的空间较小,堆是向高地址扩展的数据结构,是不连续的内存区域。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

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

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

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

4.写一个便利构造器

+ (id)Person {
    Person *person=[Person alloc]init];
    return [person autorelease]; //ARC时不用 autorelease
}

5.截取字符串“404 | https://www.google.com.hk/”中,“|”字符前面和后面的数据,分别输出它们。

NSString * str = @"404 | https://www.google.com.hk/";
NSArray *array = [str componentsSeparatedByString:@"|"]; //这是分别输出的截取后的字符串
for (int i = 0; i<[array count]; ++i) {
    NSLog(@"%d=%@",i,[array objectAtIndex:i]);
}

6.用obj-c写一个冒泡排序

- (void)sortData:(NSMutableArray *)dataSource{
    for (int i = 0; i<[dataSource count]; i++) {
        for (int j = i+1; j<[dataSource count]; j++) {
            int a = [[dataSource objectAtIndex:i] intValue];
            int b = [[dataSource objectAtIndex:j] intValue];
            if (a>b) {
                [dataSource replaceObjectAtIndex:i withObject:[NSString stringWithFormat:@"%d",b]];
                [dataSource replaceObjectAtIndex:j withObject:[NSString stringWithFormat:@"%d",a]];
            }
        }
        NSLog(@"%@",[dataSource objectAtIndex:i]);
    }
}

7.简述你对UIView、UIWindow和CALayer的理解

UIView:属于UIkit.framework框架,负责渲染矩形区域的内容,为矩形区域添加动画,响应区域的触摸事件,布局和管 理一个或多个子视图。

UIWindow:属于UIKit.framework框架,是一种特殊的UIView,通常在一个程序中只会有一个UIWindow,但可以手动创建多个UIWindow,同时加到程序里面。UIWindow在程序中主要起到三个作用:

  • 作为容器,包含app所要显示的所有视图
  • 传递触摸消息到程序中view和其他对象
  • 与UIViewController协同工作,方便完成设备方向旋转的支持

CAlayer:属于QuartzCore.framework,是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处理用户事件。UIView和CALayer是相互依赖的,UIView依赖CALayer提供内容,CALayer依赖UIView一共容器显示绘制内容。

延伸: UIViewController:管理视图的几成熟,每个视图控制器都有一个自带的视图,并且负责这个视图相关的一切事务。方便管理视图中的子视图,负责model与view的通信;检测设备旋转以及内存警告;是所有视图控制类的积累,定义了控制器的基本功能。

8.写一个完整的代理,包括声明,实现

9.分析json、xml的区别?json、xml解析方式的底层是如何处理的?

**区别: **

  • 可读性方面:基本相同,xml的可读性比较好

  • 可扩展性方面:都具有很好的扩展性

  • 编码难度方面:相对而言JSON的编码比较容易

  • 解码难度:json的解码难度基本为零,xml需要考虑子节点和父节点

  • 数据体积方面:json相对于xml来讲,数据体积小,传递的速度跟快些

  • 数据交互方面:json与JavaScript的交互更加方便,更容易解析处理,更好的数据交互

  • 数据描述方面:xml对数据描述性比较好

  • 传输速度方面:json的速度远远快于xml

JSON底层原理:遍历字符串中的字符,最终根据格式规定的特殊字符,比如{}号,[]号, : 号等进行区分,{}号是一个字典的开始,[]号是一个数组的开始, : 号是字典的键和值的分水岭,最终乃是将json数据转化为字典,字典中值可能是字典,数组,或字符串而已。

**XML底层原理: **XML解析常用的解析方法有两种:DOM解析和SAX解析。DOM 采用建立树形结构的方式访问XML 文档,而SAX 采用的事件模型。DOM 解析把 XML 文档转化为一个包含其内容的树,并可以对树进行遍历。使用 DOM 解析器的时候需 要处理整个 XML文档,所以对性能和内存的要求比较高。SAX在解析 XML 文档的时候可以触发一系列的事件,当发现给定的tag 的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低,因为它让开发人员自己来决 定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。

SAX与DOM的区别(扩展):

  • SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且由于应用程序只是 在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不 必解析整个文档;它可以在某个条件得到 满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。另一方面,由 于应用程序没有以任何方式存储数据,使用 SAX 来更改数据或在数据流中往后移是不可能的。

  • DOM 以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数 据和结构作出更改。它还可以在任何时候在树中上下 导航,而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单 得多。另一方面,在内存中构造这样的树涉及大量的开销。大型文件完全占用系统内存容量的情况并不鲜见。此外,创建一 棵 DOM 树可能是一个缓慢的过程。

  • 选择 DOM 还是选择 SAX,这取决于下面几个因素: 应用程序的目的:如果打算对数据作出更改并将它输出为 XML,那么在大多数情况下,DOM 是适当的选择。并不是说使 用 SAX 就不能更改数据,但是该过程要复杂得多,因为您必须对数据的一份拷贝而不是对数据本身作出更改。 数据容量: 对于大型文件,SAX 是更好的选择。数据将如何使用:如果只有数据中的少量部分会被使用,那么使用 SAX 来将该部分数据提取到应用程序中可能更好。 另一方面,如果您知道自己以后会回头引用已处理过的大量信息,那么 SAX 也许不是恰当的选择。

  • 对速度的需要:SAX 实现通常要比 DOM 实现更快。

  • SAX 和 DOM 不是相互排斥的,记住这点很重要。可以使用 DOM 来创建 SAX 事件流,也可以使用 SAX 来创建 DOM 树。事实上,用于创建 DOM 树的大多数解析器实际上都使用 SAX 来完成这个任务!

10.ViewController的didReceiveMemoryWarning 是在什么时候被调用的?默认的操作是什么?

当程序接到内存警告时ViewController将会收到这个消息:didReceiveMemoryWarning 从iOS3.0开始,不需要重载这个函数,把释放内存的代码放到viewDidUnload中去。 这个函数的默认实现是:检查controller是否可以安全地释放它的view,如果view可以被释放,那么这个函数释放view并调用viewDidUnload。重载这个函数来释放controller中使用的其他内存。但要调用这个函数的super实现来允许父类(一般是UIVIewController)释放view。 如果ViewController保存着view的子view的引用,在早期的iOS版本中,应该在这个函数中来释放这些引用。而在iOS3.0或更高版本中,应该在viewDidUnload中释放这些引用。

11.面向对象的三大特征,并作简单的介绍。

封装、继承、多态。
封装是面向对象的特征之一,是对象和类概念的主要特性。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的 数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。隐藏对象的属性和实现细节,仅对外公开接口,提高代码安全性,封转程度越高,独立性越强,使用越方便。 继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过 继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类” 多态性:允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子 对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

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

多态。主要是将数据类型的确定由编译时,推迟到了运行时。这个问题其实浅涉及到两个概念,运行时和多态。简单来说, 运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。多态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat;那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。也就是不同的对象以自己的方式响应了相同的消 息(响应了eat这个选择器)。因此也可以说,运行时机制是多态的基础。

13.为什么很多内置类如UITableViewController的delegate属性都是assign而不是retain的?

会引起循环引用。若是retain,在alloc一次之后,若release一次,会导致内训泄漏,若release两次会导致两个对象的dealloc嵌套执行,结果就是都没有执行成功,最后崩溃! 所有的引用计数系统,都存在循环应用的问题。例如下面的引用关系:
对象a创建并引用到了对象b.
对象b创建并引用到了对象c.
对象c创建并引用到了对象b.
这时候b和c的引用计数分别是2和1。 当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放。 b不释放,c的引用计数就是1,c也不会被释放。从此,b和c永远留在内存中。 这种情况,必须打断循环引用,通过其他规则来维护引用关系。常见的delegate往往是assign(ARC用weak)方式的属性而不是 retain方式的属性,赋值不会增加引用计数,就是为了防止delegation两端产生不必要的循环引用。 如果一个UITableViewController对象a通过retain获取了UITableView对象b的所有权,这个UITableView对象b的 delegate又是a,如果这个delegate是retain方式的,那基本上就没有机会释放这两个对象了。自己在设计使用 delegate模式时,也要注意这点。

14.ObjC中,与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?

与retain配对使用的方法是release,因为retain使retainCount计数加1,release使retainCount计数减1;与 retain语义相反的是release。 与alloc配对使用的是release,因为:alloc是使retainCount计数加1,使retainCount计数减1。与alloc语义相反的是dealloc,因为:alloc是创建一个对象,dealloc是销毁一个对象。

15.分别描述内存管理要点、autorelease、release、NSAutoreleasePool?并说明autorelease是什么时候被release的?简述什么时候由你负责释放对象,什么时候不由你释放?[NSAutoreleasePool release]和[NSAutoreleasePool drain]有什么区别?

内存管理要点: Objective-C 使用引用计数机制(retainCount)来管理内存。内存每被引用一次,该内存的引用计数+1,每被释放一次引用计数-1。当引用计数 = 0 的时候,调用该对象的 dealloc 方法,来彻底从内存中删除该对象。 alloc,allocWithZone,new(带初始化)时:该对象引用计数 +1;
retain:手动为该对象引用计数 +1;
copy:对象引用计数 +1;
mutableCopy:生成一个新对象,新对象引用计数为 1;
release:手动为该对象引用计数 -1; autorelease:把该对象放入自动释放池,当自动释放池释放时,其内的对象引用计数 -1。
NSAutoreleasePool是通过接收对象向它发送的autorelease消息,记录该对象的release消息,当自动释放池被销毁时,会自动向池中的对象发送release消息。
autorelease 是在自动释放池被销毁,向池中的对象发送release。只能释放自己拥有的对象, 区别是:在引用计数环境下(在不使用ARC情况下),两者基本一样,在GC环境下,release 是一个no-op(无效操作),所以无论是不是gc都使用drain。

16.iOS有没有垃圾回收?autorelease 和垃圾回收制(gc)有什么关系?

没有。autorelease只是延迟释放,gc是每隔一段时间询问程序,看是否有无指针指向的对象,若有,就将它回收。他们两者没有什么关系。

17.drawRect和layoutSubviews的区别

两个方法都是异步执行的,layoutSubviews方便数据计算,drawRect方便视图重绘。 layoutSubviews对subviews重新布局。layoutSubviews方法调用先于drawRect

18.简述NotificationCenter、KVC、KVO、Delegate?并说明它们之间的区别?

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

线程是进程的基本单位 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下 不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的 地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较 大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

20.http和scoket通信的区别?socket连接相关库,TCP,UDP的连接方法,HTTP的几种常用方式?

http和scoket通信的区别: http是客户端用http协议进行请求,发送请求时候需要封装http请求头,并绑定请求的数据,服务器一般有web服务器配合(当然也非绝对)。 http请求方式为客户端主动发起请求,服务器才能给响应,一次请求完毕后则断开连接,以节省资源。服务器不能主动给客户端响应(除非采取http长连接技术)。ios主要使用类是NSURLConnection。 scoket是客户端跟服务器直接使用socket“套接字”进行连接,并没有规定连接后断开,所以客户端和服务器可以保持连 接通道,双方都可以主动发送数据。一般在游戏开发或股票开发这种要求即时性很强并且保持发送数据量比较大的场合使用。主要使用类是CFSocketRef。 UDP:是用户数据报协议:主要用在实时性要求高以及对质量相对较弱的地方,但面对现在高质量的线路不是容易丢包除非 是一些拥塞条件下 ,如流媒体 TCP:是传输控制协议:是面连接的,那么运行环境必然要求其可靠性不可丢包有良好的拥塞控制机制如http ftp telnet等。
http的常用方式:get,post

21.What is lazy loading?

就是懒加载模式,只在用到的时候才去初始化。也可以理解成延时加载。 我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。 一个延时载,避免内存过高,一个异步加载,避免线程堵塞。

22.你连接服务器用的是什么方法,如果请求过程中,网络出了问题这么办?

NSURLConnection连接后,有一系列委托方法来接受来自服务器的响应和数据,其中接受相应的方法回得到服务器要传 回的数据有多大,接受数据的方法会反复调用来不断接受服务器数据,如果网络出问题了,会调用一个方法让你来做相关处理。

23.分别描述类别(categories)和延展(extensions)是什么?以及两者的区别?继承和类别在实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?

类别:在没有原类.m文件的基础上,给该类添加方法; 延展:一种特殊形式的类别,主要在一个类的.m文件里声明和实现延展的作用,就是给某类添加私有方法或是私有变量。 两个的区别:延展可以添加属性并且它添加的方法是必须要实现的。延展可以认为是一个私有的类目。 继承和类别在实现中的区别:类别可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。 Category只能为对象添加方法,却不能添加成员变量的原因:如果可以添加成员变量,添加的成员变量没有办法初始化.这是语言规则。

24.Objective-C有私有方法么?私有变量呢?如多没有的话,有没有什么代替的方法?

objective-c类里面的方法只有两种, 静态方法和实例方法.但是可以通过把方法的声明和定义都放在.m文件中来实现一个表面上的私有方法。
有私有变量,可以通过@private来修饰,或者把声明放到.m文件中。在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的。

25.谈谈你对MVC的理解?为什么要用MVC?在Cocoa中MVC是怎么实现的?你还熟悉其他的OC设计模式或别 的设计模式吗?

MVC就是Model-View-Controller的缩写,M指的是业务模型,V指的是用户页面,C指的是控制器。MVC是架构模式,是讲M和 V的代码分离,从而使同那个一个程序可以使用不同的表现形式。 M:表示数据和业务规则,V是用户看到的并与之交互的页面,C是接受用户的输入并调用M和V取完成用户需求的 单例,代理,观察者,工厂模式等 单例模式:说白了就是一个类不通过alloc方式创建对象,而是用一个静态方法返回这个类的对象。系统只需要拥有一个的 全局对象,这样有利于我们协调系统整体的行为; 代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用.比如一个工厂生产了产品,并不想 直接卖给用户,而是搞了很多代理商,用户可以直接找代理商买东西,代理商从工厂进货.常见的如QQ的自动回复就属于代 理拦截,代理模式在iphone中得到广泛应用.
观察者模式: 当一个物体发生变化时,会通知所有观察这个物体的观察者让其做出反应。实现起来无非就是把所有观察者的 对象给这个物体,当这个物体的发生改变,就会调用遍历所有观察者的对象调用观察者的方法从而达到通知观察者的目的;

26.c和obj-c如何混用?

  • obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码,处理mm文件可以识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj- c的代码,因为cpp只是cpp。
  • 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题
  • 在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。

27.举出5个以上你所熟悉的ios sdk库有哪些和第三方库有哪些?

ios-sdk:
Foundation.framework,CoreGraphics.framework,UIKit.framework, MediaPlayer.framework, CoreAudio.framework
第三方库:

  • json编码解码;
  • ASIHTTPRequest等相关协议封装;
  • EGORefreshTableHeaderView下拉刷新代 码;
  • AsyncImageView 异步加载图片并缓存;
  • SDWebImage——简化网络图片处理

28.objc优缺点

29.OC中的数字对象都有哪些,简述它们与基本数据类型的区别是什么

Objective-C中的数字对象NSNumber; Objective-C中的基本类型和C语言中的基本类型一样.主要有:int,long,float,double,char,void,bool等. 对于基本类型变量,不需要用指针,也不用手动回收,方法执行结束会自动回收.数字对象需要指针,也需要手动回收内存。

30.如何将产品进行多语言发布?

程序国际化;
比如:本地化应用程序名称
1).选中工程,Info—Localizations点击“+”添加要国际化的语言。
2).在InfoPlist.strings右边会多出一个三角形,点击展开可看到InfoPlish.strings(english)和
InfoPlish.strings(chinese)两个版本的文件;
3).在InfoPlish.strings(english)文件中加入: CFBundleDisplayName ="Program"; 其中“Program”为英文应用程序名称,同理在InfoPlish.strings(chinese)文件中加入: CFBundleDisplayName ="应用程序"; 其中“应用程序”为中文名称,注意:CFBundleDisplayName加不加双引号都行;
4).编辑Info.plist,添加一个新的属性Application has localized display name, 设置其类型为boolean,并将其 value设置为YES即可。

31.什么是动态链接库和静态链接库?调用一个类的静态方法需不需要release?

程序的编译过程--链接--- 静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是 把调用的函数所在文件模块 (DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找 相应函数代码,因此需要相应DLL文件的支持。 静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还 可以再包含其他的动态或静态链接库。
动态的是:运行时才加载到内存中,静态:编译时就加载到内存中 静态方法也就是类方法,不需要release

32.声明一个静态方法和一个实例方法? (就是类方法和对象方法)

33.什么是沙箱模型?哪些操作是属于私有api范畴?

某个iphone工程进行文件操作有此工程对应的指定的位置,不能逾越。 iOS常见私有api的应用(比如直接发送短信,访问沙箱之外的磁盘文件).

34.如何将敏感字变成** 延展---几个字变为几个*如何实现?

调用stringByReplacingOccurrencesOfString:withString:给定字符串,指定替换字,替换**

35.iphone阅读器,如果要读取一个文本文件,请问你是如何处理编码问题的?另外像pdf格式的文件,你如何读取?

首先检测文本编码格式(只需读取小部分用来判断), iphone手机阅读器中对于PDF格式的阅读,可以直接用UIWebView控件显示,也可以从网上下到很多直接读取pdf格式 的代码
直接从pdf中得到数据。复杂表格动画

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
-(void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation: (UITableViewRowAnimation)animation;- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; 

36.在开发大型项目的时候,如何进行内存泄露检测的? 内存泄露怎么处理?

如何检测内存泄露:可以通过xcode的自带工具run---start with performance tool里有instruments下有个leaks工具,启动此工具 后,运行项目,工具里可以显示内存泄露的情况,双击可找到源码位置,可以帮助进行内存泄露的处理。 如何处理:先定位到具体位置, 再解决之。

37.请写出代码,用blocks来取代protocol,并比较两种方法的优势。实际应用部分?请写出代码,用blocks取代协议或回调方法

38.有哪些传值方式,view和view之间是如何传值的? block, target-action ,代理,属性

39.给定的一个字符串,判断字符串中是否还有png,有就删除它?

NSMutableString *mstr=[NSMutableString stringWithFormat:@"ccc"]; 
NSRange substr = [mstr rangeOfString:@"png"]; //字符串查找,可以判断字符串中是否有 
if (substr.location != NSNotFound) {
 [mstr deleteCharactersInRange:substr]; 
} 

40.编译语言和解释语言的区别

区别:C语言,OC语言属于编译语言;解释语言:也可以理解为脚本文件,不需要编译, 编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的 话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语 言的程序执行效率高,但也不能一概而论,部分解释型语言的解释器通过在运行时动态优化代码,甚至能够使解释型语言的 性能超过编译型语言。 解释则不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译, 比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每 执行一次就要翻译一次,效率比较低。解释是一句一句的翻译。

41. 给用户推送的通知的伪代码

42.ViewController的loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分别是在什么时候调用的?在自定义ViewController的时候这几个函数里面应该做什么工作?

1).viewDidLoad 此方法只有当view从nib文件初始化的时候才被调用
2).viewDidUnload当系统内存吃紧的时候会调用该方法,在该方法中将所有IBOutlet(无论是property还是实例变量) 置为nil(系统release view时已经将其release掉了)在该方法中释放其他与view有关的对象、其他在运行时创建(但 非系统必须)的对象、在viewDidLoad中被创建的对象、缓存数据等 release对象后,将对象置为nil(IBOutlet只需要 将其置为nil,系统release view时已经将其release掉了) dealloc方法,viewDidUnload和dealloc方法没有关联,dealloc还是继续做它该做的事情
流程应该是这样:
(loadView/nib文件)来加载view到内存 -->viewDidLoad函数进一步初始化这些view -->内存不足时,调用 viewDidUnload函数释放views -->当需要使用view时有回到第一步
如此循环
3).viewWillAppear方法,视图即将过渡到屏幕上时调用,(一般在返回需要刷新页面时,我都选择使用代理,所以很少用到)
4).viewWillDisappear方法,这个A->B之后,A在B之后的操作

43.描述程序启动的顺序

1).main.m是程序的入口
2).UIApplicationMain()创建应用程序对象,并且为此对象指定委托,检测程序的执行,同时开启事件循环,处理程序接收到的事 件
3).UIApplicationDelegate方法的执行
4).加载window
5).指定根视图控制器
6).在指定的试图控制器中添加控件,实现应用程序界面

44.OC中是所有对象间的交互是如何实现的?

通过指针实现的

45.objective-c中的类型转换分为哪几类?

可变与不可变之间的转化; 可变与可变之间的转化; 不可变与不可变之间。

46.获取项目根路径,并在其下创建一个名称为userData的目录?

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:];
 // 创建文件系统管理器
 NSFileManager *fileManager = [[NSFileManager alloc] init]; 
// 判断userData目录是否存在
 if(![fileManager fileExistsAtPath:[NSString stringWithFormat:@"%@/userData", documentsDirectory]]) { // 不存在,创建一个userData目录
 [fileManager createDirectoryAtPath:[NSString stringWithFormat:@"%@/userData", documentsDirectory]withIntermediateDirectories:false attributes:nil error:nil];
 } 

47.浅复制和深复制的区别?

浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身。//通过对象的指针来访问这个对象----只赋值地址 深层复制(mutableCopy):复制引用对象本身---再创建一个对象 意思就是有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的 只不过是是一个指针,对象本身资源 还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一 个思想。深复制就好理解了,内存中存在了两份独立对象本身。//当修改A时,A copy不变。

48.obc中可修改和不可以修改类型可修改不可修改的集合类。

这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。比如NSArray和 NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间。

49.什么是安全释放?

 [_instance release],_instance = nil;

50.类变量的@protected ,@private,@public,@package声明各有什么含义?

变量的作用域不同,@protected 该类和所有子类中的方法可以直接访问这样的变量,这是默认的;@private 该类中的方法可以访问这样的变量,子类不可以; @public除了自己和子类方法外,也可以被其他类或者其他模块中的方法访问;@package 目前尚未得出结论

51.OC中异常exception 怎么捕获?不同的CPU结构上开销怎样?C中又什么类似的方法? 了解一下异常捕获CPU的开销:

52.关于Objective-C++中的异常处理,可以相互捕获到吗?

不可以;

53.什么是序列化或者Acrchiving,可以用来做什么,怎样与copy结合,原理是什么?

54.runloop是什么?在主线程中的某个函数里调用了异步函数,怎么样block当前线程,且还能响应当前线程的 timer事件,touch事件等.

---NSRunLoop,NSTimer需要自己实现----GCD的返回主线程的方法,看前面的题
run loop,正如其名称所示,是线程进入和被线程用来响应事件以及调用事件处理函数的地方。需要在代码中使用控制语 句实现run loop的循环,也就是说,需要代码提供while 或者 for循环来驱动run loop。在这个循环中,使用一个 runloop对象[NSRunloop currentRunloop]执行接收消息,调用对应的处理函数。

55.描述下拉刷新的实现机制?

获取数据,刷新页面

56.什么是沙盒?沙盒包含哪些文件,描述每个文件的使用场景。如何获取这些文件的路径?如何获取应用程序包中文件的路径?

沙盒是某个iphone工程进行文件操作有此工程对应的指定的位置,不能逾越。 包括:四个文件夹:documents,tmp,app,Library。 手动保存的文件在documents文件里。 Nsuserdefaults保存的文件在tmp文件夹里。
Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备 份的信息。AppName.app 目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以 您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。Library 目录:这个目录下有两个子目 录:Caches 和 PreferencesPreferences 目录包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是 应该使用NSUserDefaults类来取得和设置应用程序的偏好.Caches 目录用于存放应用程序专用的支持文件,保存应用程 序再次启动过程中需要的信息。tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。
获取这些目录路径的方法:
1).获取家目录路径的函数:
NSString *homeDir = NSHomeDirectory();
2).获取Documents目录路径的方法:

NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];

3).获取Caches目录路径的方法:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];

4).获取tmp目录路径的方法:
NSString *tmpDir = NSTemporaryDirectory();
5).获取应用程序程序包中资源文件路径的方法:
例如获取程序包中一个图片资源(apple.png)路径的方法:

NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”]; 
UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath]; 

代码中的mainBundle类方法用于返回一个代表应用程序包的对象。

57.介绍一下XMPP?有什么优缺点吗?

XMPP(Extensible Messaging and Presence Protocol,前称)是一种以XML为基础的开放式实时通信协议,是 经由互联网工程工作小组(IETF)通过的互联网标准。简单的说,XMPP就是一种协议,一种规定。就是说,在网络上传 东西,要建立连接,TCP/IP连接,建立后再传东西,而XMPP就是规定你传的东西的格式。XMPP是基于XML的协议。 优点
开放: XMPP协议是自由、开放、公开的,并且易于了解。 而且在客户端 、 服务器 、 组件 、 源码库等方面,都已经各自有多种实现。 标准: 互联网工程工作小组( IETF )已经将Jabber的核心XML流协议以XMPP之名,正式列为认可的实时通信及Presence技术。 而XMPP的技术规格已被定义在RFC 3920及RFC 3921 。 任何IM供应商在遵循XMPP协议下,都可与Google Talk实现连接。 证实可用: 第一个Jabber(现在XMPP)技术是Jeremie Miller在1998年开发的,现在已经相当稳定;数以百计的开发者为XMPP技术而努 力。 今日的互联网上有数以万计的XMPP服务器运作着,并有数以百万计的人们使用XMPP实时传讯软件。
分散式: XMPP网络的架构和电子邮件十分相像;XMPP核心协议通信方式是先创建一个stream,XMPP以TCP传递XML数据流,没有 中央主服务器。 任何人都可以运行自己的XMPP服务器,使个人及组织能够掌控他们的实时传讯体验。
安全: 任何XMPP协议的服务器可以独立于公众XMPP网络(例如在企业内部网络中),而使用SASL及TLS等技术的可靠安全性,已自 带于核心XMPP技术规格中。
可扩展: XML 命名空间的威力可使任何人在核心协议的基础上建造定制化的功能;为了维持通透性,常见的扩展由XMPP标准基金会 。
弹性佳: XMPP除了可用在实时通信的应用程序,还能用在网络管理、内容供稿、协同工具、文件共享、游戏、远程系统监控等。
多样性: 用XMPP协议来建造及布署实时应用程序及服务的公司及开放源代码计划分布在各种领域;用XMPP技术开发软件,资源及支持的 来源是多样的,使得使你不会陷于被“绑架”的困境。
缺点
数据负载太重:
随着通常超过70%的XMPP协议的服务器的数据流量的存在和近60%的被重复转发,XMPP协议目前拥有一个大型架空中存在的 数据提供给多个收件人。 新的议定书正在研究,以减轻这一问题。
没有二进制数据:
XMPP协议的方式被编码为一个单一的长的XML文件,因此无法提供修改二进制数据。 因此, 文件传输协议一样使用外部的 HTTP。 如果不可避免,XMPP协议还提供了带编码的文件传输的所有数据使用的Base64 。 至于其他二进制数据加密会话 (encrypted conversations)或图形图标(graphic icons)以嵌入式使用相同的方法。 79、谈谈对性能优化的看法,如何做? 控制好内存,不用的内存实时释放;冗余代码;用户体验度;耗时操作,开线程进行处理 80、写一个递归方法:计算N的阶乘,然后将计算结果进行存储。以便应用退出后下次启动可直接获取该值。 开启一个线程,在线程种实现递归的方法,将结果存到本地,下次运行时先看本地,没有在运行这个递归方法。

58.简述应用程序按Home键进入后台时的生命周期,和从后台回到前台时的生命周期? 应用程序:

-[AppDelegate application:willFinishLaunchingWithOptions:]
-[AppDelegate application:didFinishLaunchingWithOptions:] 
-[AppDelegate applicationDidBecomeActive:] 
退到后台:
-[AppDelegate applicationWillResignActive:] 
-[AppDelegate applicationDidEnterBackground:] 
回到前台: 
-[AppDelegate applicationWillEnterForeground:] 
-[AppDelegate applicationDidBecomeActive:] 
ViewController之间加载页面: 
-[mainViewController viewDidLoad] -[mainViewController viewWillAppear:] 
-[mainViewController viewWillLayoutSubviews] 
-[mainViewController viewDidLayoutSubviews] 
-[mainViewController viewDidAppear:] 
退出当前页面: 
-[mainViewController viewWillDisappear:]
-[mainViewController viewDidDisappear:]
返回之前页面:
-[mainViewController viewWillAppear:]
-[mainViewController viewWillLayoutSubviews]
-[mainViewController viewDidLayoutSubviews]
-[mainViewController viewDidAppear:]

59.简述值传递和引用传递的区别?

所谓值传递,就是说仅将对象的值传递给目标对象,就相当于copy;系统将为目标对象重新开辟一个完全相同的内存空间。所谓引用传递,就是说将对象在内存中的地址传递给目标对象,就相当于使目标对象和原始对象对应同一个内存存储空间。此时,如 果对目标对象进行修改,内存中的数据也会改变。

60.NSArray和NSMutableArray的区别,多线程操作哪个更安全?

NSArray更安全,当同时被访问时,NSArray是不可改变

61.当前有一个数组,里面有若干重复的数据,如何去除重复的数据?可以由数组,到集合。

62.isKindOfClass、isMemberOfClass、selector作用分别是什么

isKindOfClass作用是某个对象属于某个类型,包括继承的类型
isMemberOfClass:某个对象确切属于某个类型,是不是具体的实例
selector:通过方法名,获取在内存中的函数的入口地址

63.写出下面程序段的输出结果

NSDictionary *dict = [NSDictionary dictionaryWithObject:@"a string value" forKey:@"akey"]; 
NSLog(@"%@", [dict objectForKey:@"akey"]);
[dict release];

打印输出 a string value,然后崩溃----原因:便利构造器创建的对象,之后的release,会造成过度释放

64.请分别写出SEL、id、@的意思?

SEL是“selector”的一个类型,表示一个方法的名字-------就是一个方法的入口地址
id是一个指向任何一个继承了Object(或者NSObject)类的对象。需要注意的是id是一个指针,所以在使用id 的时候不需要加*。
@:OC中的指令符

65.以.mm为拓展名的文件里,可以包含的代码有哪些?

.mm是oc和C++混编类型文件后缀,给编译器识别的。

66.你了解svn,cvs等版本控制工具么?

版本控制 svn,cvs 是两种版控制的器,需要配套相关的svn,cvs服务器。scm是xcode里配置版本控制的地方。版本控制 的原理就是a和b同时开发一个项目,a写完当天的代码之后把代码提交给服务器,b要做的时候先从服务器得到最新版本, 就可以接着做。 如果a和b都要提交给服务器,并且同时修改了同一个方法,就会产生代码冲突,如果a先提交,那么b提交 时,服务器可以提示冲突的代码,b可以清晰的看到,并做出相应的修改或融合后再提交到服务器。

posted on 2018-10-08 16:29  广坤山货  阅读(233)  评论(0编辑  收藏  举报