iOS开发基本概念问题

原文:http://blog.sina.com.cn/s/blog_aeb8e4450101blmp.html


1OC 语言的基本特点

OC 语言是 语言的一个超集,只是在 的基础之上加上了面向对象(oo) 的特性;
OC 与 Java 语言相同都是单继承,这一点与 C++语言不同(多重继承);
OC 不支持命名空间机制,取而代之的是在类名之前添加前缀,以此来区分。

2、以下命名正确的是

(1)类 (PersonpersonObjectAndKeyspersonAndOther) (2)对象 (objectAndKeysPerson_person$dog) (3)实例变量 (_dog^agenameName、)

3、数据类型和表达式

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

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

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

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

page1image7944  page1image8112  page1image8280  page1image8448  page1image8608  page1image8768  page1image8928  page1image9088  page1image9248 page1image9408 page1image9568 page1image9728  page1image9888 page1image10048 page1image10208 page1image10368

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

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

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

cd的值分别为-162-12
(
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 语句区别与联系以及它的优势在哪里

page2image9912 page2image10072 page2image10232 page2image10392  page2image10552 page2image10712  page2image10872 page2image11032  page2image11192 page2image11352  page2image11512 page2image11672 page2image11832  page2image11992 page2image12152  page2image12312  page2image12472

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

do {
k *= number % 10;

number /= 10;
} while
(number);

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

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

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

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

page3image7472 page3image7632  page3image7792 page3image7952 page3image8112 page3image8272 page3image8432 page3image8592 page3image8752 page3image8912  page3image9072

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

page4image6592

.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 = [super init];

if (self) {
}
return self;

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

...... }

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

} @end

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

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

page5image7368  page5image7536 page5image7696

而是又其他人来实现。协议经常用来实现委托对象(委托设计模式)。 如果一个类采用了一个协议,那么它必须实现协议中必须需要实现的方法,在 协议中的方法默认是必须实现(@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)——键值编码,间接的方式访问实 例变量。

page6image6008 page6image6168 page6image6328 page6image6488  page6image6648 page6image6808 page6image6968 page6image7128  page6image7288 page6image7448  page6image7608 page6image7768  page6image7928 page6image8088  page6image8248

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

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

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

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

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

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

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

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

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

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

page7image6688 page7image6848 page7image7008  page7image7168 page7image7328 page7image7488  page7image7648 page7image7808 page7image7968  page7image8128 page7image8288 page7image8448  page7image8608 page7image8768 page7image8928  page7image9088 page7image9248 page7image9408 page7image9568

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

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

个实例正在引用它。当它为 时,系统会自动调用 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){

page8image7392 page8image7552 page8image7712  page8image7872 page8image8032 page8image8192  page8image8352  page8image8520

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

} }

- (Person *)person {

@synchronized(self) {

return _person; }

}

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

17、堆和栈的区别

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

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

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

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

page9image5872  page9image6032 page9image6192  page9image6352 page9image6512 page9image6672 page9image6832 page9image6992  page9image7152

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:一般认为,是在内存中重新开辟了一个新的内存空间,用来

page10image6608  page10image6768 page10image6928

存储新的对象,和原来的对象是两个不同的地址,引用计数分别 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

page11image6080  page11image6240 page11image6400  page11image6560  page11image6720 page11image6880  page11image7040 page11image7200 page11image7360 page11image7520

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

// 2 // 1

// 0

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

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

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

(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]表示的是池本身

page12image8152  page12image8312 page12image8472  page12image8632 page12image8792  page12image8952 page12image9112 page12image9272 page12image9432

不会销毁,而是池子中的临时对象都被发送 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(键值观察)是一种能使得对象获取到其他对象属性变化的通知

page13image5888  page13image6048 page13image6208  page13image6368 page13image6528  page13image6688 page13image6848 page13image7008 page13image7168 page13image7328 page13image7488 page13image7648 page13image7808  page13image7968

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

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

34、在 objective c 中如何实现 KVO

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

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath

options:(NSKeyValueObservingOptions)options

context:(void *)context;

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

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

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

forKeyPath:(NSString *)keyPath;

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

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

page14image6600  page14image6760 page14image6920  page14image7080 page14image7240  page14image7400  page14image7560 page14image7720  page14image7880 page14image8040  page14image8200

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

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

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

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

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

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

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

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

39、什么叫键路径?

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

page15image5720  page15image5880 page15image6040 page15image6200  page15image6360 page15image6520 page15image6680 page15image6840 page15image7000

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

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

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

- (void)dealloc {

self.object = nil;

[super dealloc]; }

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

答:对象 创建并引用到了对象 b;对象 创建并引用到了对象 c;对象 创 建并引用到了对象 b。这时候 和 的引用计数分别是 和 1

当 不再使用 b,调用 release 释放对 的所有权,因为 还引用了 b,所以 的引用计数为 1,不会被释放。

不释放,的引用计数就是 1,也不会被释放。从此,和 永远留在内存 中。

这种情况,必须打断循环引用,通过其他规则来维护引用关系。我们常见的 delegate 往往是 assign 方式的属性而不是 retain 方式 的属性, 赋值不会增加引用计数,就是为了防止 delegation 两端产生不必要的循环引用。

42isMemberOfClass 和 isKindOfClass 联系与区别 答:两者都能检测一个对象是否是某个类的成员, 两者之间的区别是:

page16image7984 page16image8144  page16image8304 page16image8464 page16image8624 page16image8784  page16image8944 page16image9104  page16image9264 page16image9424 page16image9584 page16image9744 page16image9904

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

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

page17image2584 page17image2744 page17image2904 page17image3064  page17image3224

二、常见 语言笔试题

1、 2、 3、 4、 5、 6、 7、 8、 9、 10

三、常见 iPhone UI 笔试题 1UIViewController 生命周期

答:(1)视图控制器的装载:当视图控制器从 nib 文件而来时,nid 中创建一 个视图,然后调用viewDidLoad 方法,不会调用 loadView 方法。当没有创建 nib 文件,创建一个视图控制器时,视图控制器调用会调用 loadView 方法创建一个 空的视图,当你覆盖 loadView 方法时,需要创建一个视图给视图控制器,或者

page18image4208 page18image4368 page18image4528 page18image4688

调用父类的 loadView 方法,完成视图的创建后,再调用 viewDidLoad 方法。之 后调用viewWillAppear:方法和 viewDidAppear 方法表示视图已全部渲染完成。 (2)视图控制器的卸载:当设备内存不足时,调用 didRecieveMemoryWarning,如果当前的视图控制器可以被安全的释放,那么将 调用 viewWillUnload:方法和 viewDidUnload 方法,我们在这两个方法中将视图 所拥有的强引用对象释放。当在 iOS6 中不在调用这个两个方法而是只调用 didRecieveMemoryWarning,那么我们就在这个方法中将当前视图控制器中的视

图所拥有的对象销毁。

2、什么是响应事件者链

答:当 Application Kit 在应用程序中构造对象时,会为每个窗口建立响应者链。 响应者链中的基本对象是 UIWindow 对象及其视图层次。在视图层次中级别较 低的视图将比级别更高的视图优先获得处理事件或动作消息的机会。NSWindow 中保有一个第一响应者的引用,它通常是当前窗口中处于选择状态的视图,窗口 通常把响应消息的机会首先给它。对于事件消息,响应者链通常以发生事件的窗 口对应的 NSWindow 对象作为结束,虽然其它对象也可以作为下一个响应者被 加入到 NSWindow 对象的后面。

3、简述 tableView 的重用机制

答:表视图的重用机制是一种节约设备内存的机制,尤其是需要显示大量数据 时,显得尤其重要。当我们开始创建表视图的一行时,首先定义一个静态的字符 串作为单元格的标识符,然后通过该标识符去检测该表视图中有没有闲置的单元 格,如果没有,我们就创建一个新的单元格,并且给它指定一个标识符。如果已 有闲置的单元格,则直接从表视图中取出来,给单元重新赋上新的值。初学者容 易犯的错误时,当我需要自定义一个单元格时,将自定义实例创建在“括号”外, 这样单元格中会出现重叠现象,这是初学者常见的错误。此外,如果当前表视图 显示 10 个单元格,那么 11 个就可以满足重用的需要。

page19image6096 page19image6256 page19image6416 page19image6576 page19image6736 page19image6896 page19image7056  page19image7216 page19image7376 page19image7536 page19image7696 page19image7856 page19image8016 page19image8176  page19image8336 page19image8496 page19image8656 page19image8816 page19image8976 page19image9136 page19image9296 page19image9456  page19image9616

4、代理、通知和 KVO 的区别以及它们的优缺点

答:代理是一种回调机制,且是一对一的关系,而通知是一对多的关系,一个 中心对象向所有的观察者提供变更通知(KVO 是被观察者向观察者直接发送通 知,这是通知和 KVO 的区别)。http://blog.csdn.net/dqjyong/article/details/7685933 http://www.apple.com.cn/developer/mac/library/documentation/Cocoa/Conc eptual/CocoaFundamentals/CommunicatingWithObjects/chapter_6_section_7.ht ml

5、如何适配 iOS6

答:iPhone5 的分辨率是 1136x640, 尺寸是 568x320,适配 iphone5 的屏幕 首先要添加 [email protected] 作为启动图片,否则上下会有黑边出现。

用宏定义获取设备的尺寸,减少程序中的硬编码。

#define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(6401136), [[UIScreen mainScreen] currentMode].size) : NO)

6、线程和进程的区别

答:线程是进程的一部分,进程是程序的一部分。

进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生 影响,而线程只是一个进程中的不同执行路径。

线程有自己的堆栈和局部变量,主线程死掉就等于整个进程死掉。所以多进程 的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。 但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能 用进程。

page20image6072 page20image6232  page20image6392 page20image6552  page20image6712 page20image6872  page20image7032

7、什么是 MVC,如何理解

答:表示 model,即数据模型,表示 view,即视图,表示 viewController, 即视图控制器,使用MVC 的目的是将 和 的实现代码分离,从而使同一个程 序可以使用不同的表现形式。存在的目的则是确保 和 的同步。

8bounds 和 frame 的联系与区别 答:如下图所示:

9、如何发起一个 http 同步、异步网络请求 答:(1)同步请求

// 构造 url
NSURL *url = [NSURL URLWithString:@"http://www.taobao.com"]; // 
创建一个请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url]; NSURLResponse *response;

page21image4400

// 发送同步请求,请求成功后返回数据

NSData *resultData = [NSURLConnection sendSynchronousRequest:request

returningResponse:&response NSString *datastring = [[NSString alloc] initWithData:resultData

encoding:NSUTF8StringEncoding]; self.resultText.text = datastring;

(2)异步请求
NSURL *url = [NSURL URLWithString:request_url];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 
发送异步请求
[NSURLConnection connectionWithRequest:request

delegate:self];
// 
接受加载的数据
- (void)connection:(NSURLConnection *)connection

didReceiveData:(NSData *)data { [_data appendData:data];

}

// 数据加载完以后调用

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

NSString *datastring = [[NSString alloc] initWithData:_data

encoding:NSUTF8StringEncoding]; self.resultText.text = datastring;

}

error:nil];

大家详见课件。

10、多线程的基本概念,在 cocoa 实现多线程提供了那 些解决方案

答:NSThreadblock 语句等等详细见课件。 11NSRunloop 的基本概念

答:Run loops 是线程相关的的基础框架的一部分。一个 run loop 就是一个 事件处理的循环,用来不停的调度工作以及处理输入事件。使用 run loop 的目的 是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。

12、网络数据传输一般有几种格式,他们有哪些区别, 你又用的哪些框架进行解析的

答:JSONXML;

JSON:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于 人阅读和编写。同时也易于机器解析和生成。

1、对象是一个无序的“‘名称/值’对”集合。一个对象以“{”开始,以“}” 结束。每个“名称”后跟一个“:”,“‘名称/值’对”之间使用“,”分隔。

2、数组是值(value)的有序集合。一个数组以“[”开始,“]”结束。值之间 使用“,”分隔。

XML:可扩展标记语言(extensible Markup Language,简称:XML),是一种标 记语言。XML 设计用来传送及携带数据信息,不用来表现或展示数据,HTML 语言则用来表现数据,此外,XML 天生有很好的扩展性,JSON 当然也有。不过 JSON 在 Javascript 主场作战,可以存储 Javascript 复合对象,有着 xml 不可比拟 的优势。

page23image5952 page23image6112 page23image6272

13Dom 和 Sax 解析的优缺点

答:DOMDocument Object Model,中文叫文档对象模型。
SAXSimple API for XML的简称,中文叫XML简单应用程序接口。
Dom 解析(常见框架是 GDataXMLNode)的优点是解析 XML 变得简单,但是

耗费内存资源,因为它是一次性将 XML 转换成 Dom 对象。Sax 解析 XML 较为 复杂,但是解析的速度快、而且占用内存较小(NSXMLParser)。

14CALayer 的基本概念,它与 UIView 又是什么关系

答:通常会将 UIView 理解为能够在屏幕上直接制图的对象,实际上从技术的 角度而言,视图自身并不在窗口上绘图,它只知道如何在 CALayer 对象上绘图。 我们在创建一个 UIView 实例时,该对象会自动创建一个层(自己创建的这个层 称为隐式层)。视图在绘图时,将内容画在自己的层上。当视图在层上完成绘图 后,系统会将层拷贝到屏幕上。如果我们创建一个 CALayer 层的实例,我们称 之为显示层,层其实就是一副位图。(层的委托对象是 UIView)

15cocoa touch 框架

iPhone OS 应用程序的基础 Cocoa Touch 框架重用了许多 Mac 系统的成熟模 式,但是它更多地专注于触摸的接口和优化。
UIKit 为您提供了在 iPhone OS 上实现图形,事件驱动程序的基本工具,其建立 在和 Mac OS X 中一样的 Foundation 框架上, 包括文件处理,网络,字符串操作等。

Cocoa Touch 具有和 iPhone 用户接口一致的特殊设计。有了 UIKit,您可以使 用 iPhone OS 上的独特的图形接口控件,按钮, 以及全屏视图的功能,您还可以使用加速仪和多点触摸手势来控制您的应用。

page24image7032  page24image7192 page24image7352 page24image7512 page24image7672 page24image7832 page24image7992 page24image8152 page24image8312 page24image8472 page24image8632

各色俱全的框架 除了 UIKit 外,Cocoa Touch 包含了创建世界一流 iPhone 应 用程序需要的所有框架,从三维图形,到专业音效,
甚至提供设备访问 
API 以控制摄像头,或通过 GPS 获知当前位置。
Cocoa Touch 既包含只需要几行代码就可以完成全部任务的强大的 Objective-C 框架,也在需要时提供基础的 语言 API 来直接访问系统。这些框架包括:

Core Animation:通过 Core Animation,您就可以通过一个基于组合独立图层的 简单的编程模型来创建丰富的用户体验。

Core Audio:Core Audio 是播放,处理和录制音频的专业技术,能够轻松为您的 应用程序添加强大的音频功能。

Core Data:提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚 至可处理任何应用或大或小的数据模型。

功能列表:框架分类
下面是 
Cocoa Touch 中一小部分可用的框架:
音频和视频:
Core Audio ,OpenAL ,Media Library ,AV Foundation 数据管理 :Core Data ,SQLite
图形和动画 :Core Animation ,OpenGL ES ,Quartz 2D 网络:Bonjour ,WebKit ,BSD Sockets
用户应用:Address Book ,Core Location ,Map Kit ,Store Kit

16、将变量保存到本地,列举两个简单的方法
答:使用 writeToFile 方法,将字符串、字典、数组直接保存。将对象保存到

本地,需要实现 NSCoding 协议。 17、简述真机调试的基本流程

答:参考真机调试流程一文
page25image7056

18、远程推送通知的基本流程 答:参看远程推送通知一文

19、如何发布我们的应用程序

答:参考真机调试的流程,将程序打包成一个发布的包,最后使用使用 application Loader、或者用xCode 直接发布。

可参考:http://mobile.51cto.com/iphone-280746.htm 20、 setNeedsLayoutsetNeedsDisplay

答:调用 setNeedsLayout 方法将会调用 UIView 的 layoutSubview,会对视图 重新排版;调用setNeedsDisplay 方法将会调用 UIView 的 drawRect 方法,会对 视图重新绘制。(它们都是异步执行的)

21、以下函数主要完成什么事情?

UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))

答:这个函数被调用的主入口点创建应用程序的对象和应用程序委托和事件循 环。注意这个函数虽有返回值,但这个函数在程序没有结束时,永远不会返回。

22、用过什么内存优化管理工具 答:instruments

23iOS 后台可以运行哪些类型的程序,如何自定义一 个后台运行的任务

答:audio(音频播放)、location(位置服务)、voip(网络电话),在 plist 文 件中 Required backgroud modes 属性中添加需要在后台执行的任务。

一般自定义的后台任务只能执行 600s。如果需要自定义一个后台任务超过

page26image6088  page26image6248 page26image6408 page26image6568 page26image6728

600s,见以下代码,详见课件。 if (__count % 500 == 0) {

UIApplication*application = [UIApplication sharedApplication]; bgTask=[application

beginBackgroundTaskWithExpirationHandler:^(void) {

[application endBackgroundTask:bgTask];

bgTask = UIBackgroundTaskInvalid; }];

}

24iPhone4 代和 ipad3 之后,我们在添加图片时,需要 注意些什么

答:一般情况下为需要为 iPhone(以上)、ipad(以上)准备 张图片, 一张原图,一张 retina 图(双倍、按像素),假设原图为 image.png,高清图我 们命名为 [email protected]
iPad 图片:

page27image4808  page27image4968 page27image5128  page27image5288

大小(像素)

page27image7912

文件名

page27image9120

用途

重要度

page27image12056 page27image12376

512*512

——

iTunes 展示图片

推荐有

page27image16128

1024*1024

——

iTunes 展示图片

page27image19040 page27image19360

推荐有

page27image20784

72*72

page27image22032

Icon-72.png

App store\home

page27image24704 page27image25024

必须有

page27image25952 page27image26272

144*144

[email protected]

App store\home

推荐有

page27image30048

50*50

page27image31296

Icon-Small-50.png

SettingSpotlight

page27image33928 page27image34248

推荐有

page27image35176 page27image35496

100*100

[email protected]

SettingSpotlight

推荐有

page27image39232

768*1004

Default-Portrait.png

启动页竖屏

page27image43112 page27image43432

推荐有

1536*2008

[email protected]

启动页竖屏

推荐有

748*1024

Default-Landscape.png

启动页横屏

推荐有

1496*2048

[email protected]

启动页横屏

推荐有

iPhone 图片:

page28image1592

大小(像素)

文件名

page28image3384

用途

page28image4464 page28image4784

重要度

page28image6472

57*57

page28image7720

Icon.png

page28image8928

App store\home

page28image9896
page28image10392 page28image10712

必须有

page28image11640 page28image11960

114*114

[email protected]

App store\home

推荐有

page28image15736

29*29

page28image16984

Icon-Small.png

page28image18192

SettingSpotlight

page28image19120
page28image19616 page28image19936

推荐有

page28image20864 page28image21184

58*58

[email protected]

SettingSpotlight

推荐有

page28image24920

320*480

page28image26168

Default.png

page28image27376

启动页

page28image28304
page28image28800 page28image29120

推荐有

page28image30048 page28image30368

640*960

Default @2x.png

启动页

推荐有

page28image34144

640*1136

page28image35656

[email protected]

page28image36864

iPhone5 启动页

page28image37832
page28image38328 page28image38648

推荐有

page28image39576 page28image39896

http://developer.apple.com/library/ios/#documentation/userexperience/conc eptual/mobilehig/IconsImages/IconsImages.html http://pinchmultimedia.com/blog/ios-5-icon-sizes-and-names-new-ipad

25、什么是沙盒,文档目录结构的作用

答:IOS 应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其 它地方访问,此区域被成为沙盒。每个应用程序都有自己的存储空间;应用程序 不能翻过自己的围墙去访问别的存储空间的内容;应用程序请求的数据都要通过 权限检测,假如不符合条件的话,不会被放行。

Documents 目录:您应该将所有的应用程序数据文件写入到这个目录下。这个目 录用于存储用户数据或其它应该定期备份的信息。

AppName.app 目录:这是应用程序的程序包目录,包含应用程序的本身。由于 应用程序必须经过签名,所以在运行时不能对这个目录中的内容进行修改,否则 可能会使应用程序无法启动。

Library 目录:这个目录下有两个子目录:Caches 和 Preferences
Preferences 
目录包含应用程序的偏好设置文件。我们不应该直接创建偏好设置 文件,而是应该使用NSUserDefaults 类来取得和设置应用程序的偏好。

page28image43848  page28image44008 page28image44168 page28image44328 page28image44488 page28image44648  page28image44808 page28image44968  page28image45128 page28image45288 page28image45448  page28image45608 page28image45768 page28image45928 page28image46088

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 类方法用于返回一个代表应用程序包的对象。

26http 和 socket 区别

答:http 是客户端用 http 协议进行请求,发送请求时候需要封装 http 请求头, 并绑定请求的数据,服务器一般有 web 服务器配合(当然也非绝对)。 http 

page29image7224  page29image7384 page29image7544  page29image7704  page29image7864 page29image8024  page29image8184  page29image8344 page29image8504  page29image8664 page29image8824  page29image8984 page29image9144  page29image9304 page29image9464  page29image9624  page29image9784 page29image9944  page29image10104 page29image10264  page29image10424 page29image10584 page29image10744 page29image10904 page29image11064

求方式为客户端主动发起请求,服务器才能给响应,一次请求完毕后则断开连接, 以节省资源。服务器不能主动给客户端响应(除非采取 http 长连接技术)。iphone 主要使用类是 NSURLConnection

scoket 是客户端跟服务器直接使用 socket“套接字”进行连接,并没有规定连 接后断开,所以客户端和服务器可以保持连接通道,双方都可以主动发送数据。 一般在游戏开发或股票开发这种要求即时性很强并且保持发送数据量比较大的 场合使用。主要使用类是 CFSocketRef

四、常见算法题

1、冒泡排序 答:冒泡排序思想:

int index2 = 0;
for (int index1 = 0; index1 < 12; index1++) {

// 取出第(n+1)个数与前者进行比较
// 比较完第一轮,将最大的数置顶,就好比是气泡一样 for (index2 = index1+1 ; index2 < 12; index2++) {

int variable = 0;
if (a[index1] < a[index2]) {

variable = a[index1]; a[index1] = a[index2]; a[index2] = variable;

} }

}

2、快速排序 答:快速排序思想:

int array[10]={12, 32, 2, 52, 45, 65, 58, 56, 98, 54}, i, j, t;

for(i = 1; i <= 9; i++) {

page30image8544 page30image8704  page30image8864 page30image9024 page30image9184 page30image9344  page30image9504

j = i-1; // 第 个 t = array[i]; // 1

while(j >= 0 && t > array[j]) // 第几个可以向前循环几次 新加 入的比前面的大

{

j = j-1; }

array[j+1] = t; }

3、插入排序 答:插入排序实现思想:

int i, j;
for (i = 1; i < 12; i++) {

if (a[i] < a[i - 1]) {

array[j+1] = array[j];

// 后移

int temp = a[i]; // 保存值
for (j = i - 1; j >= 0 && a[j] > temp; j--) {

a[j + 1] = a[j]; }

a[j + 1] = temp; }

}

// 如果前一个数大于后一个数 


你可能感兴趣的:(iOS面试)