常见iOS开发面试题(有10w多访问量的面试题)

1.objective-c常见面试题

1OC 语言的基本特点 

OC 语言是 C 语言的一个超集,只是在 C 的基础之上加上了面向对象(oop) 的特性; 

OC 与 Java 语言相同都是单继承,这一点与 C++语言不同(多重继承);
OC 不支持命名空间机制,取而代之的是在类名之前添加前缀,以此来区分。 

2、以下命名正确的是 

(1)类(Person、person、ObjectAndKeys、personAndOther) (2)对象 (objectAndKeys、Person、_person、$dog) (3)实例变量 (_dog、^age、name、Name、) 

3、数据类型和表达式 

(1inta=5,b=2,c=2,result,result=a*b++-c;result的值和b的值。 

答:result 的值为 8,b 的值为3。根据运算符的优先级(乘法比加法的优先 级高),首先计算 a*b,因为 b++,“++”在后面。因此,先计算 a*b,其结果为 10,计算完成后 b 的结果++,因此b 的结果为3。最后与c 相减,result 的结果 为8。 

(2)result= (b > a)? a++ : ((++c> a-b)? ++c : b++),求result,a,b,的值,假设 abc的值分别为123。(右结合性;运算符号优 先级->结合性->顺序) 

答:运算符号相同,因此判断运算符号的结合性。即表达式为:result = (b > a)? a++ :(++c > a-b)? ++c : b++),然后我们判断表达是(b > a)是否为真。 因此,result 的结果为1,a、b、c 的值分别为 2、2、3。 

(3)inta = 5, b = 12, c = 3, result = 0, d = 5, e = 2,result= a -= b /= c += d %= e;求result,abcde。 

答:运算符号相同,因此,判断该运算符号的结合性。赋值运算符号为右结合, 因此,表达式从右开始计算。d %= 2,分解为d = d % e,d 值为 1;计算c += d, 同理,c值为4。再计算b /= c,b值为3;再计算a -= b,a值为2。最后将a 值赋值给 result。因此,result 的结果为2,a、b、c、d、e 的结果分别是 2、3、 4、1、2。(复合赋值运算符效率更高) 

(4)如果第三题中 d-5,求result。答:%(模运算符号)的符号取决与第一个数,因此,result 的值为-1,a、b、 

c、d、e 的值分别为-1、6、2、-1、2。
(5)假设 ab的值分别是456。那么result = a < b < c,求result 是多少? 

答:result 值为 1。(6)解释id类型 

答:任意类型对象。程序运行时决定才对象的类型。 (7)解释nil,发送消息时,程序是否会出现异常。 

答:不会,在OC 语言中可以 nil 发送消息,而程序不会抛出异常,其结果是什么也不做。 

4、流程控制语句 

(1)switch 语句每一case 都需要添加 break 语句吗?
答:switch 语句中的 break 语句不是必须的,此外,default 语句也不是必须 

添加的。如果在某一个条件中添加(case 语句之后)break 语句,即当条件满足 时,跳出 switch 语句。
(2)do while 语句和 while 语句的区别,并写出几个死循环。 

答:do while 语句至少执行一次循环体,而while 语句括号中的表达式为真, 才执行循环体。 

while(1){ }、for(;)
(3)switch 语句 if 语句区别与联系以及它的优势在哪里 

 

答:均表示条件的判断,switch 语句表达式只能处理是整型、字符型和枚举类 型,而选择流程语句则没有这样的限制。但 switch 语句比选择流程控制语句效 率更高。
(4)int number = 26,k = 1,求 的值 

do {
k *= number % 10; 

number /= 10;
} while
(number); 

答:do while 语句的特点是,循环体至少执行一次。程序执行到表达式 k*=number%10,已知number 为26,又已知算术运算符比赋值运算符好优先级别高,因此先计算 number%10,其结果为 6;已知 k 为1,因此,k 的结果为6。number/=10,number 的值2。while 语句判断表达式是否为真,此时,number 为 2。继续执行循环体,此时number、k 的值分别为 2、6,2%10 的结果仍为 2,再与 k 相乘,其 k 的结果为12。程序执行到循环体第二行 number/10,此时 number 已为 10,因此,number 的结果为 0。while 表达式内条件为假,循环就此结束。因此,k 的值为 12。 

5、写出以下方法类型、方法名称和返回值类型 

(1)-(void)initWithName:(NSString*)name andAge:(int) age;
(2)+(Person*)personName:(NSString)name; (3)-(void)setName:(NSString *)name setAge:(int)agesetDelegate:(id)delegate; 

(4)-(NSString*)name;
(5)+ (Kingdom *)shareKingdom; (6)+(Kingdom *)defaultKingdom; 

6、创建一个这样的 Person类,用类目的形式给Person 添加一组方法(方法任意)、并且若干私有方法以及在 Person类中添加一个协议(手写代码) 

.h文件
#import @”Person.h” 

@protocol PersonDelegate @required
- (void)thisRequiredMethod;
@optional 

- (void)thisOptionalMethod; @end 

@interface Person : NSObject { @private 

NSString *_name; 

NSInteger _age; } 

-  (void)test;

-  (void)test1:(int)arg1;

-  (void)test1:(int)arg1 test2:(int)arg2; @end
@interface Person (Create)
- (id)initWithName:(NSString *)aName;
- (id)initWithName:(NSString *)aName age:(int)age; + (id)personBorn; 
@end

  

.m文件 

@interface Person () - (void)private1;
- (void)private2; @end @implementation 

- (void)test {}
- (void)test1:(int)arg1 {}
- (void)test1:(int)arg1 test2:(int)arg2 {} - (void)private1 {}
- (void)private2 {} 

- (id)initWithName:(NSString *)aName { self = [superinit]; 

if (self) {
}
return self; 

}
- (id)initWithName:(NSString *)aName age:(int)age { 

...... } 

+ (id)personBorn {
Person *person = [[Person alloc] init]; return [person autorelease]; 

} @end 

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

答:OC 中的协议是一个方法列表,且多少有点相关。它的特点是可以被任何 类使用(实现),但它并不是类(这里我们需要注意),自身不会实现这样方法, 

      

而是又其他人来实现。协议经常用来实现委托对象(委托设计模式)。如果一个类采用了一个协议,那么它必须实现协议中必须需要实现的方法,在 协议中的方法默认是必须实现(@required),添加关键字@optional,表明一旦 

采用该协议,这些“可选”的方法是可以选择不实现的。

8#include #import 的区别、#import @class 的区别 

答:#include 和#import 其效果相同,都是查询类中定义的行为(方法)。只 是后者不会引起交叉编译,确保头文件只会被导入一次。@class 的表明,只定义了类的名称,而具体类的行为是不知道的,一般用于.h 文件,因此,@class 比#import 编译效率更高。此外@class 和#import 的主要区别在于解决引用死锁 的问题。 

9@public@protected@private它们的含义与作用 

1@public:答:对象的实例变量的作用域在任意地方都可以被访问 

2@protected:答:对象的实例变量作用域在本类和子类都可以被访问 

3@private:答:实例变量的作用域只能在本类(自身)中访问 

(4)通过指针运算符(->)能够访问到private方法吗?OC 语言中还提供 了哪些方式能直接和间接的访问对象的实例变量? 

答:不可以,可以通过合成存取器访问实例变量,也可自己定义 setter 和getter 方法访问实例变量,KVC(key value coding)——键值编码,间接的方式访问实 例变量。 

 

10、简述类目优点和缺点,如果覆盖本类或者父类的方法,会出现什么问题? 

答:(1)优点:不需要通过增加子类而增加现有类的行为(方法),且类目中的方法与原始类方法基本没有区别;通过类目可以将庞大一个类的方法进行划分,从而便于代码的日后的维护、更新以及提高代码的阅读性。 

(2)缺点:无法向类目添加实例变量,如果需要添加实例变量,只能通过 定义子类的方式;类目中的方法与原始类以及父类方法相比具有更高级别的优先 级,如果覆盖父类的方法,可能导致 super 消息的断裂。因此,最好不要覆盖原 始类中的方法。 

11、简述内存管理基本原则 

答:(1)如果使用alloc、copy(mutableCopy)或者 retian 一个对象时,你就 有义务,向它发送一条 release 或者autorelease 消息。其他方法创建的对象,不 需要由你来管理内存。 

(2)向一个对象发送一条 autorelease 消息,这个对象并不会立即销毁,而是将这个对象放入了自动释放池,待池子释放时,它会向池中每一个对象发送 一条 release 消息,以此来释放对象。 

(3)向一个对象发送 release 消息,并不意味着这个对象被销毁了,而是 当这个对象的引用计数为 0 时,系统才会调用 dealloc 方法,释放该对象和对象 本身它所拥有的实例。 

12、在 objective c中是否支持垃圾回收机制? 答:OC是支持垃圾回收机制的(Garbagecollection简称GC),但是apple的 

移动终端中,是不支持 GC 的,Mac 桌面系统开发中是支持的。 13、什么是ARC 技术?与GC 是否相同? 

答:ARC 是 AutomaticReference Counting 的简称,我们称之为自动引用计数, 

是在IOS 5之后推出的新技术,它与GC的机制是不同的。我们在编写代码时, 不需要向对象发送 release 或者 autorelease 方法,也不可以调用 delloc 方法, 编译器会在合适的位置自动给用户生成release 消息(autorelease),ARC 的特点是自动引用技术简化了内存管理的难度。 

14、什么是retain count
答:每一个对象都默认有一个 retainCount 的属性,数值的多少表示现在有几 

个实例正在引用它。当它为 0 时,系统会自动调用 dealloc 方法,将内存回收。15、写出@property (nonatomic ,retain) Person *person; 

@synthesize person 具体实现,并指出其中含义。 

非原子性事物 

-  (void)setPerson:(Person *)person {
if (_person!= person){ [_person release]; _person = [person retain]; } 
}

-  (Person *)person { 
return _person; } 
原子性事物
- (void)setPerson:(Person*)person {
@synchronized(self) { 
if (_person!= person){ 

[_person release]; _person = [person retain]; } 

} } 

- (Person *)person { 

@synchronized(self) { 

return _person; } 

16、深、浅复制的基本概念以及他们的区别,可以用图 来加以说明。 

17、堆和栈的区别 

答:(1)栈区(stack)由编译器自动分配释放 ,存放方法(函数)的参数值,局部变量的值等。先进后出。 

(2)堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时由OS回收。 

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

(4)文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。 (5)程序代码区—存放函数体的二进制代码。 

18、用户自定义了一个对象,如何实现拷贝(可变和不可变拷贝) 

答:必须实现 copying 和mutableCopying 协议,表示返回一个不可变和可变的对象。否则,程序将会出现异常。
-(id)copyWithZone:(NSZone *)zone

Person *person = [[self Class] allocWithZone:zone];person ->age = self.age;
person ->name = self.name;
return person; 

}
- (id)mutableCopyWithZone(NSZone *)zone; 

19、以下代码有问题吗?如果有,会出现什么问题 

- (void) setName:(NSString *)name { 

self.name = name; } 

答:引起重复调用(自己调用自己)。 

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

答:(1)assign:普通赋值,一般常用于基本数据类型,常见委托设计模式,以此来防止循环引用。(我们称之为弱引用,weak) 

(2)retain:保留计数,获得到了对象的所有权。引用计数在原有基础上 加1。 

(3)copy:一般认为,是在内存中重新开辟了一个新的内存空间,用来 

      

存储新的对象,和原来的对象是两个不同的地址,引用计数分别 1。但是当 copy 对象为不可变对象时,那么 copy 的作用相当于 retain。因为,这样可以节约内 存空间。 

21、解释以下关键字,staticselfsuper用实例说明 

答static: 静态全局变量,持久性作用、存储区域在静态区域,它的生命周期 和应用进行绑定。程序结束时,由系统自动回收。 

self:当前消息的接收者。 super:向父类发送消息。 

22、解释 self = [super init]方法 

答:容错处理,当父类初始化失败,会返回一个 nil,表示初始化失败。由于继承的关系,子类是需要拥有父类的实例和行为的,因此,我们必须先初始化父 类,然后再初始化子类。 

23、当我们释放对象时,为什么需要调用[super dealloc]方法? 

答:(1)因为,子类是继承自父类,那么子类中有一些实例变量(对象),是继承子父类的,因此,我们需要调用父类方法,将父类所拥有的实例进行释放。 

(2)先将子类所拥有的实例进行释放,然后再释放父类的。 24objective-c有私方法么?私有变量呢? 

答:是有的,我们称之为延展。私有变量也是有的(@private)。25、以下每行代码执行后,person对象的retain count分 

别是多少?
Person *person =[[Person alloc] init]; // 1 

                   

[person retain]; [person release]; [personrelease]; 

// 2 // 1 

// 0 

26、在某个方法中 self.name = _namename = _name他 们有区别吗,为什么? 

答:是有区别的,前者是存在内存管理的,它会对_name 对象进行保留或者拷 贝操作,而后者是普通赋值。 

27、假设我们写了一个类的合成存取器,@property(nonatomic, copy) NSString *name;@synthesizename; 

(1)NSString*aName = [NSString stringWithFormat:@”a”];
person.name = aName 
此时 name 的引用计数是几,为什么,这么做 

有什么好处?
答:它的引用技术是 2,相当于 retain 操作。 

(2)NSMutableString*aName = [NSMutableString stringWithFormat:@”a”];同上 

答:它的引用技术是 1,真正意义上的拷贝。(3)返回这一个字符串的类型,是可变的吗?如果不是,为什么,我们 又如何做? 

答:不可变,因为合成存取器中用的 copy。如果,我们需要返回一个可变 的字符串时,那么必须自己实现 setter 和getter 方法。 

28、自动释放池是什么,如何工作 

答:自动释放池是 NSAutorelease 类的一个实例,当向一个对象发送 autorelease 消息时,该对象会自动入池,待池销毁时,将会向池中所有对象发送一条 release 消息,释放对象。[pool release]; [pool drain]表示的是池本身 

                 

不会销毁,而是池子中的临时对象都被发送release,从而将对象销毁。 29、为什么delegate(代理)属性都是assign 而不是retain 

的? 答:防止循环引用,以至对象无法得到正确的释放。 

30iOS 开发中数据持久性,有哪几种。 答:文件写入、对象归档、sqlite3数据库、coredata 

31、对象归档的基本概念,以及它的特点是什么? 

答:归档为对象的数据持久化提供了一种解决方法,它特点是给归档的对象进行加密,增强了数据的安全性。此外,自定义类的对象归档必须实现 NSCoding 协议。 

32、什么是谓词?
答:cocoa 中提供了一个 NSPredicate 的类,该类主要用于指定过滤器的条件, 

每一个对象通过谓词进行筛选,判断条件是否匹配。
33、什么是 KVC KVO?以及它们之间的关系是什么 

答:(1)KVC(键值编码)是一种间接访问对象实例变量的机制,该机制可以 不通过存取方法就可以访问对象的实例变量。非对象类型的变量将被自动封装或 者解封成对象。此外,使用KVC 能够简化代码。我们需要注意 KVC 有两个较为 明显的缺点,一旦使用 KVC 你的编译器无法检查出错误,即不会对设置的键、 键路径进行错误检查,且执行效率要低于(虽然效率已经很高,你已经感觉不到)合成存取器方法和自定的 setter 和 getter 方法。因为使用 KVC 键值编码,它必 须先解析字符串,然后在设置或者访问对象的实例变量。 

(2)KVO(键值观察)是一种能使得对象获取到其他对象属性变化的通知 

                           

机制。
(3)实现 KVO 键值观察模式,被观察的对象必须使用KVC 键值编码来修 

改它的实例变量,这样才能被观察者观察到。因此,KVC 是KVO 的基础或者说 KVO 的实现是建立在 KVC 的基础之上的。 

34、在 objective c中如何实现KVO 

答:(1)注册观察者(这里我们需要注意,观察者和被观察者不会被保留也不 会被释放) 

- (void)addObserver:(NSObject *)observerforKeyPath:(NSString *)keyPath 

options:(NSKeyValueObservingOptions)options 

context:(void *)context; 

(2)接收变更通知
- (void)observeValueForKeyPath:(NSString*)keyPath 

ofObject:(id)object change:(NSDictionary *)changecontext:(void *)context; 

(3)移除对象的观察者身份
-(void)removeObserver:(NSObject *)observer 

forKeyPath:(NSString *)keyPath; 

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

答:因为子类的某些实例是继承自父类的,因此需要调用[super dealloc]方法, 来释放父类拥有的实例,其实也就是子类本身的。一般来说我们优先释放子类拥 有的实例,最后释放父类所拥有的实例。 

                     

36、以下代码会出项问题吗?如果有,我们又该如何修 改? 

@property (nonatomic, copy) NSMutableString *name;@synthesize name = _name; 

self.name = [NSMutableStringstringWithFormat:@"..xyz"]; [self.name insertString:@"abc"atIndex:0]; 

答:不可变字符串不可以被修改,可以通过自定义 set 方法,将字符串的拷贝 改为可变的拷贝。 

37、当我们将一个对象加入自动释放池时,该对象何时 被销毁 

答:我们在 application kit 应用程序中,自动释放池中的临时对象被销毁的时间时,一个事件循环结束后。注意自动释放池没有被释放,而是被排空了,向池发送了 drain 消息。 

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

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

39、什么叫键路径? 

答:在一个给定的实体中,同一个属性的所有值具有相同的数据类型。 键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列。第一个键的性质是由先前的性质决定的,接下来每个键的值也是相 

                 

对于其前面的性质。键路径使您可以以独立于模型实现的方式指定相关对象的性 质。通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相关对 象的特定属性。 

40、以下代码存在内存泄露吗?如果有,如何去修改 

self.object = [NSObject alloc] init]; self.object =[NSObject object] retain]; self.object = [NSObject object]; 

- (void)dealloc { 

self.object = nil; 

[super dealloc]; } 

41、循环引用是什么,如何解决这样的问题 

答:对象 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 方式的属性而不是 retain 方式的属性, 赋值不会增加引用计数,就是为了防止 delegation 两端产生不必要的循环引用。 

42isMemberOfClassisKindOfClass联系与区别 

答:两者都能检测一个对象是否是某个类的成员, 两者之间的区别是: 

isKindOfClass 不但可以用来确定一个对象是否是一个类的成员,也可以用来确 定一个对象是否是派生自该类的类的成员 ,而 isMemberOfClass 做不到后一点。 

如 ClassA 派 生 自 NSObject 类 , ClassA*a = [ClassA alloc] init]; [a isKindOfClass:[NSObject class]] 可以检查出 a是否是 NSObject派生类 的成员,但 isMemberOfClass 做不到。 

 

2.面试题

1.简述OC中内存管理机制

1.1 OC的内存管理机制是自动引用计数,内存管理的原则是谁开辟谁释放,有retain的地方就要有release

1.2 内存管理分为ARC和MRC,在MRC下我们需要手动管理内存,需要使用到retain/copy/release/autorelease等方法实现内存管理。ARC下则一般不需要我们手动管理,系统会在适当的位置加上内存管理关键字。

1.3 retain是引用计数+1, 在内存管理中, 要记得内存管理原则: 谁开辟谁释放, 有retain就要有release.  release是引用计数-1. alloc匹配的是dealloc, alloc是开辟内存空间, dealloc是销毁所开辟的内存, 有开辟就要有 销毁.

 

2.readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?

readWrite读写特性, 可读可写.

readonly只读, 只有getter, 没有setter.

assign一般用于基本数据类型和ID类型.

copy拷贝, 一般用于  NSString. 分为深拷贝和浅拷贝, 深拷贝拷贝的是对象, 浅拷贝拷贝的是指针. nonatomic非原子性, 不考虑线程安全, 优点是效率高.

atomic原子性, 有点是线程安全, 缺点是效率低.

strong强引用, 和MRC下的retain一样. weak弱引用, 类似MRC下的assign. 但是要注意的是strong和weak都是修饰对象类型的属性的, 不能修饰基本数据类型. ARC下仍然使用assign修饰基本数据类型. 

 

3.关于iOS多线程问题

仔细阅读:http://www.cocoachina.com/ios/20150731/12819.html

 

4.提升UITableView性能的几点建议

仔细阅读:http://www.cocoachina.com/ios/20150729/12795.html

 

6. 线程同步和异步的区别?

同步:一个线程要等待上一个线程执行完之后才能执行当前的线程,生活中的例子(上厕所)。

异步:同时去做两件或者多件事。比如边听歌边看报。

 

7.堆和栈的区别?

栈区(stack)--由编译器自动分配释放,存放函数的参数值、局部变量的值。先进后出

堆区(heap)--一般由程序员分配释放。先进先出

全局区(静态区)(static)--全局变量和静态变量。程序结束后由系统释放。         

文字常量区--常量字符串存放在这里。程序结束后由系统释放。         

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

 

8.  iOS类是否可以多继承?

不可以,可以通过delegate和protocol和类别来实现类似多继承。

 

9.iOS本地数据存储都有哪几种方式?iOS如何实现复杂对象的存储?

1. Write写入方式:永久保存在磁盘中。但是只支持NSString、NSData、NSArray、NSDictionary。    2.NSKeyedArchiver(归档)采用归档的形式来保存数据,该数据对象需要遵守NSCod-ing协议,并且该对象对应的类必须提供 encodeWithCoder:和initWithCoder:方法。

3.SQLite(FMDB)注意FMDB不是数据库, 而是一个SQLITE管理框架. 

4.CoreData切记coredata不是数据库, 他的存储核心思想是托管对象, 只是咱们经常用的存储文件为SQLite.还可以用XML, 二进制等方式.

 

10.iOS的动态性 

 1.动态类型。 如id类型。实际上静态类型因为其固定性和可预知性而使用得更加广泛。静态类型是强类型,而动态类型属于弱类型。运行时决定接收者。

2. 动态绑定。让代码在运行时判断需要调用什么方法,而不是在编译时。与其他面向对象语言一样,方法调用和代码并没有在编译时连接在一起,而是在消息发送时才进行连接。运行时决定调用哪个方法。

3. 动态载入。让程序在运行时添加代码模块以及其他资源。用户可以根据需要加载一些可执行代码和资源,而不是在启动时就加载所有组件。可执行代码中可以含有和程序运行时整合的新类。

 

11.深拷贝和浅拷贝的理解?

深拷贝拷贝的是内容,浅拷贝拷贝的是指针。深拷贝和浅拷贝最大的区别就是子类对象的地址是否改变,如果子类对象的地址改变那么就是深拷贝。

 

12.什么是安全释放

在对象dealloc中release之后再把指针置为nil

 

13.怎样实现一个singleton。

+ (ZMYSingleton *) sharedInstance{

    static LOSingleton *sharedInstance = nil ;

   static dispatch_once_t onceToken;  // 锁

  dispatch_once (& onceToken, ^ {

      // 最多调用一次       

   sharedInstance = [[ZMYSingleton alloc] init];  

});   

return  sharedInstance;

}

 

13.RunLoop是什么?

一个RunLoop就是一个事件处理的循环,用来不停的调 度工作以及处理输入时间。使用runloop的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。runloop的设计是为了减少 cpu无谓的空转。每个开辟的线程都有一个Runloop, 主线程的Runloop时默认开启的, 咱们手动开辟的子线程Runloop是默认不开启 的, 如果需要开启, 需要调用API[[NSRunloop  currentRunloop] run]开启.最常见的需要开启Runloop的是在 子线程里面调用计时器(NSTimer), 如果不开启runloop循环方法就不能正常执行.

 

14.写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?

#define kMIN(X,Y) ((X) > (Y)) ? (Y) :(X) 

 

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

进入后台生命周期走:   

- (void)applicationWillResignActive:(UIApplication*)application;  

- (void)applicationDidEnterBackground:(UIApplication*)application;  

回到前台生命周期走:   

- (void)applicationWillEnterForeground:(UIApplication*)application;  

- (void)applicationDidBecomActive:(UIApplication*)application;

 

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

loadView:没有正在使用nib视图页面,子类将会创建自己的自定义视图层

viewDidLoad:试图被加载后调用

viewWillAppear:试图即将出现的时候调用

viewDidUnload:当系统内存吃紧的时候会调用该方法,释放掉当前未在window中显示的试图和对应的控制器

 

17.描述应用程序的启动顺序。

1、程序入口main函数创建UIApplication实例和UIApplication代理实例

2、在UIApplication代理实例中重写启动方法,设置第一ViewController

3、在第一ViewController中添加控件,实现对应的程序界面。

 

18.为什么写代理的属性都是assign而不是retain?请举例说明。

防止循环引用,

Teacher *teacher=[[Teacher alloc] init];

Student * student=[[Student alloc] init];t

eacher.delegate=student;

student.delegate= teacher;

在teacher中dealloc会release当前的Delegate,就会触发student对象release,继而也会导致student执行dealloc,在student中也会release自己的delegate,产生循环了。

 

19.UIImage初始化一张图片有几种方法?简述各自的优缺点。

1、从资源读取 , 这个方法的图片是从缓存里面获取 的, 先在缓存里面查看是不是有这个图片, 没有的话将图片添加进缓存再使用. 有的话直接使用缓存里面的. 如果这张图片用的次数比较多的话, 建议使 用这种方式. 缺点是效率低下.UIImage *image = [UIImage imageNamed:@”1.png”];

2 .从手机本地读取, 比较第一种方式, 这个事直接加 载图片的. 所以建议在图片使用率低的图片时 使用这个方法.  //读取本地图片非resourceNSString *aPath3=[NSString stringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];[UIImage imageWithContentsOfFile:aPath3]

 

20.这段代码有什么问题吗:

@implementation Person

- (void)setAge:(int)newAge {

        self.age = newAge;

}

@end

死循环

 

21.用OC写一个冒泡排序

 NSMutableArray*array = [NSMutableArray arrayWithArray:@[@"3",@"1",@"10",@"5",@"2",@"7",@"12",@"4",@"8"]];

    for (int i =0; i < array.count;i ++) {

       for (intj =0; j < array.count -1 - i; j++) {

           if([[arrayobjectAtIndex:j]integerValue] > [[arrayobjectAtIndex:j +1]integerValue]) {

               [arrayexchangeObjectAtIndex:jwithObjectAtIndex:j +1];

           }

       }

   }

    NSLog(@"%@",array);

 

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

UIView继承于UIResponder, UIResponder继承于NSObject,UIView可以响应用户事件。

CALayer继承于NSObject,所以 CALayer不能响应事件。 UIView构建界面,UIView侧重于对内容的管理,CALayer侧重于对内容的绘制。 UIView是用来显示内容的,可以处理用户事件;CALayer是用来绘制内容的,对内容进行动画处理,依赖与UIView来进行显示,不能处理用户事 件。

 

23.frame和bounds区别:

仔细阅读:http://blog.csdn.net/mad1989/article/details/8711697

 

24.写一个完整的代理

 

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

XML是标准通用标记语言 (SGML)的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。   

JSON(JavaScriptObject Notation)一种轻量级的数据交换格式,具有良好的可读                               和便于快速编写的特性。可在不同平台之间进行数据交换。JSON采用兼容性很高的、完全独立 于语言文本格式,同时也具备类似于C语言的习惯(包括C,     C++, C#, Java, JavaScript, Perl,Python等)体系的行为。这些特性使JSON成为理想 的数据交换语言。

 

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

didReceiveMemoryWarning在出现内存警告的时候执行该方法,在该方法里面释放掉暂时没使用的可重用的对象。这个方法不能手动调用.

 

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

封装、继承、多态。

封装:是把客观事物封装成抽象的类,隐藏内部的实现,对外部提供接口。

继承:可以使用现有类的所有功能,并且在无需重新编写原来的类的情况下对这些功能进行扩展。

多态:不同的对象以自己的方式响应相同的的消息的能力叫做 多态,或者说父类指针指向子类对象<如UITableView的,cellForRow方法,返回值类型是UITbaleViewCell,但是你 返回的cell可以是你自定义的cell,在比如多个类里面都有同一个方法>

 

28.简单说一下懒加载

懒加载,又称为延迟加载。通常用法,你有一个UITextField类 型的property,简单定义为userNameTextField,但是你不在初始化方法里为其alloc/init,它 就只是一个指针,不会占用内 存。在访问器里判断此property的指针是否为空,若为空,就alloc/init,这时才真正生成这个对象除非这个对 象被使用,否则它永远不会真正 生成,也就不会占用内存。

 

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

category类目:在不知道源码的情况下为一个类扩展方法,

extension:为一个类声明私有方法和变量。 继承是创建了一个新的类,而类别只是对类的一个扩展,还是之前的类。 类目的作用就是为已知的类添加方法。

 

30. #import、#include和@class有什么区别

#include c语言中引入一个头文件,但是可能出现交叉编译,

OC里面已经没有这个方式引入头文件了, 统一使用#import

#import在OC中引入自己创建的头文件

#import””是引入自己创建类的头文件

#import<>是引入系统类的头文件

#import不会出现交叉编译

@class对一个类进行声明,告诉编译器有这个类,但是类的定义什么的都不知道.

 

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

MVC是Model-VIew-Controller,就 是模型-视图-控制器, MVC把软件系统分为三个部分:Model,View,Controller。在cocoa中,你的程序中的每一个 object(对象)都将明显地仅属于这三部分中的一个,而完全不属于另外两个。model数据模型,view是对这些数据的显 示,viewcontroller就是把model拿到view中显示,起到model和view之间桥梁的作用。MVC可以帮助确保帮助实现程序最大程 度的可重用性。各MVC元素彼此独立运作,通过分开这些元素,可以构建可维护,可独立更新的程序组建, 提高代码的重用性.

单例模式,delegate设计模式,target-action设计模式

 

32.字符串替换方法:

[string stringByReplacingOccurrencesOfString:@"png" withString: @""]

 

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

编译的时候是NSString类型,运行的时候是NSData类型

 

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

iOS应用程序只能在为该改程序创建的文件系统中读取文 件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。 默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。 Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录 Library:存储程序的默认设置或其它状态信息;

Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除

tmp:提供一个即时创建临时文件的地方。

iTunes在与iPhone同步时,备份所有的Documents和Library文件。

iPhone在重启时,会丢弃所有的tmp文件。

 

35.    isKindOfClass、isMemberOfClass作用分别是什么?

-(BOOL) isKindOfClass: classObj判断是否是这个类或者是这个类子类的实例

-(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例

36.http://blog.csdn.net/huifeidexin_1/article/details/7566226

37. UITableView –UIScrollView –UIView – UIResponder - NSObject 

 

答:Grand CentralDispatch简称GCD解决多核并行运算的一种方案

看代码就行:

//  Grand CentralDispatch简称GCD技术

   

// Do any additional setup afterloading the view.

   

//   dispatch_queue_tnewDispath =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//   dispatch_async(newDispath,^{

//       [selfdownloadImage];

//    });

   

//   #defineDISPATCH_QUEUE_PRIORITY_HIGH 2

//   #defineDISPATCH_QUEUE_PRIORITY_DEFAULT  0

//   #defineDISPATCH_QUEUE_PRIORITY_LOW(-2)

//   #defineDISPATCH_QUEUE_PRIORITY_BACKGROUNDINT16_MIN

   

   

   

   

   /*dispatch queue分为下面三种:

    * Serial:又称为private dispatch queues,同时只执行一个任务。Serial queue通常用于同步访问特定的资源或数据。当你创建多   个       Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。

    * Concurrent: 又称为global dispatch queue,可以并发地执行多个任务,但是执行完成的顺序是随机的。

    * Maindispatchqueue它是全局可用的serial queue,它是在应用程序主线程上执行任务的

    */

   

   //  一般GCD 可以如下操作

   

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

       // 耗时的操作

      dispatch_async(dispatch_get_main_queue(),^{

           // 更新界面

       });

    });

   

   [selfexampleDispatch];

   

    /*

     *系统给每一个应用程序提供了三个concurrent dispatch queues。

     *这三个并发调度队列是全局的,它们只有优先级的不同。

     *因为是全局的,我们不需要去创建。我们只需要通过使用函数dispath_get_global_queue去得到队列

     */

   

  dispatch_queue_tglobalQ =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

   

   NSLog(@"global:%p",globalQ);

   dispatch_queue_tmainQ =dispatch_get_main_queue();

    NSLog(@"mainQ:%p",mainQ);

    /*

     *虽然dispatch queue是引用计数的对象,但是以上两个都是全局的队列,不用retain或release。

     */

   

   

   

    /*

    *dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。

     *这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。

     */

    timeInt = 0;

   [NSTimerscheduledTimerWithTimeInterval:1

                                   target:self

                                 selector:@selector(checkingTime)

                                 userInfo:nil

                                  repeats:YES];

   [selfexampleDispath_group];

   

   

  /*dispatch_barrier_async的使用

    *dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行

     */

   

   [selfexampleDispatch_barrier];

   

   

   /*dispatch_apply

     *执行某个代码片段N次。

     */

   dispatch_apply(5,globalQ, ^(size_t index) {

       // 执行5次

    });

39. 该问题涉及编译器的“内存对齐”问题: 

现代计算机中内存空间都是按照byte(字节)划分的,从 理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则 在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。   

对齐的作用和原因:各个硬件平台对存储空间的处理上有很大 的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台的要求对数据存放进行 对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为 32位)如果存放在偶地址开始的地方,那么一个读周期就 可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该int数据。显然在读取效率上下降很 多。这也是空间和时间的博弈。

通常,我们写程序的时候,不需要考虑对齐问题。编译器会替我们选择适合目标平台的对齐策略。当然,我们也可以通知给编译器传递预编译指令而改变对指定数据的对齐方法。 

但是,正因为我们一般不需要关心这个问题,所以因为编辑器对数据存放做了对齐,而我们不了解的话,常常会对一些问题感到迷惑。最常见的就是struct数据结构的sizeof结果,出乎意料。 

对于结构体来说,按成员中所占字节最大的是float类型,占用4个字节,一共有3个成员,所以总的占用字节为:4 * 3 = 12.       可通过编译器命令来设定:       

#progma pack (2)   

 

40.TCP:Transmission Control Protocol 传 输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说 明(specified)。 UDP是User Datagram Protocol的简称,中文名是用户数据包协议,是 OSI 参考模型中一种无连接 的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。   

面向连接:是指通信双方在通信时,要事先建立一条通信线路,其有三个过程:建立连接、使用连接和释放连接。电话系统是一个面向连接的模式,拨号、通话、挂机;TCP协议就是一种面向连接的协议。 

面向无连接:是指通信双方不需要事先建立一条通信线路,而是把每个带有目的地址的包(报文分组)送到线路上,由系统自主选定路线进行传输。邮政系统是一个无连接的模式,天罗地网式的选择路线,天女散花式的传播形式;IP、UDP协议就是一种无连接协议。

 

41. 注意问的是应用层协议,有些同学直接答了七层模型。 

      在开放系统互连(OSI)模型中的最高层,为应用程序提供服务以保证通信,但不是进行通信的应用程序本身。   

Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。   

FTP文件传输协议是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。

超文本传输协议 (HTTP-Hypertext transfer protocol) 是分布式,协作式,超媒体系统应用之间的通信协议。是万维网(world wide web)交换信息的基础。   

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式,它帮助每台计算机在发送或中转信件时找到下一个目的地。   

时间协议(TIME protocol)是一个在RFC 868内定义的网络协议。它用作提供机器可读的日期时间资讯。

 

  DNS是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库。   

SNMP(Simple Network ManagementProtocol,简单网络管理协议)的前身是简单网关监控协议(SGMP),用来对通信线路进行管理。   

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。

 

42.static关键字的作用

静态全局变量

优点:

1、节省内存。静态变量只存储一处,但供所有对象使用。

2、它的值是可以更新的。

3、可提高时间效率。只要某个对象对静态变量更新一次,所有的对象都能访问更新后的值。

 

43.iOS系统框架分为几层,分别是什么

  


 1、Core OS是位于iOS系统架构最下面的一层是核心操作系统层,它包括内存管理、文件系统、电源管理以及一些其他的操作系统任务。它可以直接和硬件设备进行交互。作为app开发者不需要与这一层打交道。

      2、Core Services是核心服务层,可以通过它来访问iOS的一些服务。

      3、Media是媒体层,通过它我们可以在应用程序中使用各种媒体文件,进行音频与视频的录制,图形的绘制,以及制作基础的动画效果。 

      4、Cocoa Touch是可触摸层,这一层为我们的应用程序开发提供了各种有用的框架,并且大部分与用户界面有关,本质上来说它负责用户在iOS设备上的触摸交互操作。

你可能感兴趣的:(iOS)