iOS面试题汇总(二)(5)
69.ViewController的 didReceiveMemoryWarning 是在什么时候被调用的?(87题)
70.谈谈你对ARC 的认识和理解?
71. 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"];
[aClasssetName: newname];
[newnamerelease];
我们来看一看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。
72. 在一个对象的方法里面:
self.name<http://self.name/> = “object”;
和
name =”object”
有什么不同?
73. 这段代码有什么问题:
@implementation Person
- (void)setAge:(int)newAge {
self.age = newAge;
}
@end
74. 什么是retaincount?
75. 以下每行代码执行后,person对象的retain count分别是多少
Person *person = [[Person alloc] init];
[person retain];
[person release];
[person release];
76. 为什么很多内置类如UITableViewController的delegate属性都是assign而不是retain的?
77. 定义属性时,什么情况使用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) { [propertyrelease]; property = [newValueretain]; }
78. autorelease的对象是在什么时候被release的?
答:autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autoreleasepool中,当该pool被释放时,该pool中的所有Object会被调用Release。对于每一个Runloop,系统会隐式创建一个Autoreleasepool,这样所有的releasepool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autoreleasepool会被销毁,这样这个pool里的每个Object(就是autorelease的对象)会被release。那什么是一个Runloop呢?一个UI事件,Timer call,delegate call, 都会是一个新的Runloop。那什么是一个Runloop呢?一个UI事件,Timer call,delegate call, 都会是一个新的Runloop。
相关新闻>>
- 发表评论
-
- 最新评论 更多>>