ios应用开发Objective-C笔试题


  Objective-C笔试题是本文要介绍的内容,很 详尽的 讲解写的答案 。大概有18个Objective-C问题供你参考学习,不多说,我们一同来看 详尽解答!

  1.Objective-C中,与alloc语义相反的 步骤是dealloc还是release?与retain语义相反的 步骤是dealloc还是release,为何?需求与alloc配对 使用的 步骤是dealloc还是release,为何?

  答:alloc与dealloc语意相反,alloc是 缔造变量,dealloc是 开释变量 。 retain 对应release,retain 保留一个对象 。调用之后,变量的计数加1 。兴许不是很显而易见,在这有例为证:

  1. - (void) setName : (NSString*) name {   
  2.      [name retain];   
  3.      [myname release];   
  4.      myname = name;   
  5. }  

  我们来解释一下: 设计,消费者在调用这个函数的时候,他 留神了内存的治理,所以他小心的写了如下代码:

  1. NSString * newname = [[NSString alloc] initWithString: @"John"];   
  2. [aClass setName: newname];   
  3. [newname release];  

  我们来看一看newname的计数是怎么 变迁的 。首先,它被alloc,count = 1; 而后,在setName中,它被retain, count = 2; 最终,消费者自己 开释newname,count = 1,myname指向了newname 。这也解释了为何需求调用[myname release] 。我们需求在给myname赋新值的时候, 开释掉以往老的变量 。retain 之后直接dealloc对象计数器没有 开释 。alloc 需求与release配对 使用,由于alloc 这个函数调用之后,变量的计数加1 。所以在调用alloc 之后, 定然要调用对应的release 。另外,在release一个变量之后,他的值 依旧有效,所以最好是后面紧接着再var = nil 。

  2.在一个对象的 步骤里面:

  self.name = “object”;

name =”object”

  有什么不同吗? 

  答:self.name = "object"会调用对象的setName() 步骤,name = "object"会直接把object赋值给目前对象的name 属性 。

  [backcolor=transparent][backcolor=transparent]

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

  1. [backcolor=transparent]@implementation Person   
  2. [backcolor=transparent]- (void)setAge:(int)newAge {   
  3. [backcolor=transparent]self.age = newAge;   
  4. [backcolor=transparent]}   
  5. [backcolor=transparent]  
  6. @end  

  答:会进入死循环 。

  4.什么是retain count?

  答: 引用计数(ref count或者retain count) 。对象的内部 保留一个数字, 示意被 引用的次数 。例如,某个对象被两个指针所指向( 引用)那么它的retain count为2 。需求销毁对 象的时候,不直接调用dealloc,而是调用release 。release会 让retain count减1,惟独retain count等于0,系统才会调用dealloc真正销毁这个对象 。

  5.以下每行代码执行后,person对象的retain count分别是多少

  1. Person *person = [[Person alloc] init]; count 1   
  2. [person retain]; count 2   
  3. [person release];count 1   
  4. [person release];retain count = 1;  

  6.为何众多内置类如UITableViewController的delegate属性都是assign而不是retain的?

  答:会引起循环 引用 。

  7.定义属性时,什么状况 使用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函数会变成下面这样:

  1. if (property != newValue) {    
  2.      [property release];         
  3.      property = [newValue retain];    
  4.  }    

  8.的对象是在什么时候被release的?

  答:autorelease实际上只不过把对release的调用延迟了,关于每一个Autorelease,系统只不过把该Object放入了目前的Autorelease pool中,当该pool被 开释时,该pool中的全部Object会被调用Release 。关于每一个Runloop,系统会隐式 缔造一个Autorelease pool,这样全部的release pool会组成一个象CallStack一样的一个栈式 构造,在每一个Runloop 完毕时,目前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object(便是autorelease的对象)会被release 。那什么是一个Runloop呢?一个UI事件,Timer call, delegate call, 都会是一个新的Runloop 。那什么是一个Runloop呢?一个UI事件,Timer call, delegate call,都会是一个新的Runloop 。

  9.这段代码有什么问题,如何 批改

  1. for (int i = 0; i < someLargeNumber; i++)   
  2. {   
  3. NSString *string = @”Abc”;   
  4. string = [string lowercaseString];   
  5. string = [string stringByAppendingString:@"xyz"];   
  6. NSLog(@“%@”, string);   
  7. }  

  答:会内存泄露,

  1. for(int i = 0; i<1000;i++){   
  2. NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init];   
  3. NSString *string = @"Abc";   
  4. string = [string lowercaseString];   
  5. string = [string stringByAppendingString:@"xyz"];   
  6. NSLog(@"%@",string);   
  7. [pool1 drain];   
  8. }  

  10.autorelease和垃圾回收机制(gc)有什么关系?

  答:不懂

  11.IPhone OS有没有垃圾回收(gc)?

  没有

  12.什么是Notification?

  答: 视察者模式,controller向defaultNotificationCenter增加自己的notification, 其余类注册这个notification就 可以收到 告诉,这些类 可以在收到 告诉时做自己的操作(多 视察者默许随机顺序发 告诉给 视察者们,而且每个 视察者都要等目前的某个 视察者的操作做完 威力轮到他来操作, 可以用NotificationQueue的 模式 调度 视察者的 反响顺序,也 可以在增加 视察者中设定反映 工夫, 取缔 视察需求在viewDidUnload 跟dealloc中都要注销) 。参考链接:http://useyourloaf.com/blog/2010/6/6/delegation-or-notification.html

  13.什么时候用delegate,什么时候用Notification?

  答:delegate针对one-to-one关系,而且reciever 可以返回值给sender,notification 可以针对one-to-one/many/none,reciever 无奈返回值给sender.所以,delegate用于sender 盼望 承受到reciever的某个 性能反馈值,notification用于 告诉多个object某个事件 。

  14.什么是KVC和KVO?

  答:KVC(Key-Value-Coding)内部的实现:一个对象在调用setValue的时候,(1)首先依据 步骤名找到运行 步骤的时候所需求的环境参数 。(2)他会从自己isa指针 联合环境参数,找到具体的 步骤实现的接口 。(3)再直接搜索得来的具体的 步骤实现 。KVO(Key-Value-Observing):当 视察者为一个对象的属性进行了注册,被 视察对象的isa指针被 批改的时候,isa指针就会指向一个之间类,而不是 实在的类 。所以isa指针其实不需求指向实例对象 实在的类 。所以我们的程序最好不要依赖于isa指针 。在调用类的 步骤的时候,最好要明确对象实例的类名 。

  15.Notification和KVO有什么不同?

  答:不晓得

  16.KVO在Objective-C中是怎么实现的?

  答:不晓得

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

  答:viewDidLoad在view 从nib文件初始化时调用,loadView在controller的view为nil时调用 。此 步骤在编程实现view时调用,view 操纵器默许会注册memory warning notification,当view controller的任何view 没有用的时候,viewDidUnload会被调用,在这里实现将retain 的view release,假如是retain的IBOutlet view 属性则不要在这里release,IBOutlet会负责release  。

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

  答:默许调用[super didReceiveMemoryWarning] 

  小结:深度解析Objective-C笔试题的内容介绍完了, 盼望本文对你有所协助!