iPhone软件开发面试题(4)

时间:2024-05-22 14:24:56 学人智库 我要投稿
  • 相关推荐

iPhone软件开发面试题(4)

  31.动态绑定

iPhone软件开发面试题(4)

  在运行时确定要调用的方法,动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定在一起,只有在消息发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运行时因子负责确定消息的接收者和被调用的方法。运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型确定了的对象发送消息时,运行环境系统会通过接收者的isa指针定位对象的类,并以此为起点确定被调用的方法,方法和消息是动态绑定的。而且,您不必在Objective-C 代码中做任何工作,就可以自动获取动态绑定的好处。您在每次发送消息时,特别是当消息的接收者是动态类型已经确定的对象时,动态绑定就会例行而透明地发生。

  32.obj-c 的优缺点

  Obj-c优点:

  1) Cateogies

  2) Posing

  3) 动态识别

  4) 指标计算

  5) 弹性讯息传递

  6) 不是一个过度复杂的 C 衍生语言

  7) Objective-C 与 C 可混合编程?

  Obj-c缺点:

  1)不支持命名空间

  2)不支持运算符重载

  3)不支持多重继承

  4)使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。

  33.sprintf,strcpy,memcpy使用上有什么要注意的地方

  strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char *dst, const char *src);

  将 src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为 '\0',由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错。具备字符串拷贝功能的函数有memcpy,这是一个内存拷贝函数,它的函数原型为memcpy(char *dst,const char* src, unsigned int len);

  将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。但是会有内存叠加的问题。

  sprintf是格式化函数。将一段数据通过特定的格式,格式化到一个字符串缓冲区中去。sprintf格式化的函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小,造成溢出。

  34. 用变量a给出下面的定义

  a)一个整型数(An integer)

  b)一个指向整型数的指针( A pointer to an integer)

  c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)r

  d)一个有10个整型数的数组( An array of 10 integers)

  e)一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)

  f)一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)

  g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as anargument? and returns an integer)

  h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointersto functions t?hat take an integer argument and returnan integer ) ? ?

  答案:

  a) int a; // An integer

  b) int *a; // A pointer to an integer

  c) int **a; // A pointer to a pointer to an integer

  d) int a[10]; // An array of 10 integers

  e) int *a[10]; // An array of 10 pointers to integers

  f) int (*a)[10]; // A pointer to an array of 10 integers

  g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer

  h) int (*a[10])(int); // An array of 10 pointers tofunctions that take an integer argument and return an integer

  35.readwrite ,readonly ,assign ,retain ,copy,nonatomic 属性的作用

  @property是 一个属性访问声明,扩号内支持以下几个属性:

  1、getter=getterName,setter=setterName,设置setter与 getter的方法名

  2、readwrite,readonly,设置可供访问级别

  3、assign,setter方法直接赋值,不进行 任何retain操作,为了解决原类型与环循引用问题

  4、retain,setter方法对参数进行release旧值再retain新值,所有 实现都是这个顺序(CC上有相关资料)

  5、copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再 Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。

  6、nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的...)。?@synthesize xxx; 来实现实际代码

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

  答:alloc与dealloc语意相反,alloc是创建变量,dealloc是释放变量。 retain 对应release,retain 保留一个对象。调用之后,变量的计数加1。或许不是很明显,

  在这有例为证:

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

  [name retain];

  [myname release];

  myname = name;

  }

  我们来解释一下:设想,用户在调用这个函数的时候,他注意了内存的管理,所以他小心的写了如下代码:

  NSString * newname = [[NSString alloc] initWithString: @"John"];

  [aClass setName: newname];

  [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。

  37.什么是retaincount?

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

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

  Person *person =[[Person alloc] init]; count 1

  [person retain]; count 2

  [person release];count 1

  [person release];retain count = 1;

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

  答:会引起循环引用。

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

  if (property != newValue)

  {

  [property release];

  property = [newValue retain];

  }

【iPhone软件开发面试题(4)】相关文章:

iPhone软件开发面试题10-23

Microsoft面试题09-04

iOS面试题07-10

公司面试题09-12

iphone锁屏密码忘了怎么办07-10

hibernate面试题10-18

英语面试题精选06-13

小升初面试题06-10

PHP面试题10-14

小升初面试题型08-24