ios 面试总结

题1:被block捕获的变量为什么不能修改?
答:block 在实现时就会对它引用到的它所在方法中定义的栈变量进行一次只读拷贝,然后在 block 块内使用该只读拷贝;
block捕获的是自动变量的const值,名字一样,不能修改

题2:__block做了什么?
答:把修饰的变量封装在一个结构体内,在这个结构体内用一个指针指向这个变量,通过这个指针就可以改变这个指针指向的内存里的值。

题3:[UIView animateWithDuration:duration animations:^{ [self.superview layoutIfNeeded]; }];
是否存在循环引用?
答:不存在循环引用,block引用了self,self没有引用block(单向强引用)。

题4:[[NSNotificationCenter defaultCenter] addObserverForName:@"someNotification" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * notification) { self.someProperty = xyz; }]; 是否存在循环引用?
答:答案如上。

题5:为什么UIScrollView的滚动会导致NSTimer失效?解决方法是什么?
答: UIScrollView 滑动时执行的是 UITrackingRunLoopMode,NSDefaultRunLoopMode被挂起,会导致定时器失效,等恢复为滑动结束时才恢复定时器
解决办法:

NSTimer *timer  = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(action:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode: NSRunLoopCommonModes]; 

题6:用kvc的集合运算符重写下面代码:

double totalSalary = 0.0;
for (Employee *employee in employees) { 
    totalSalary += [employee.salary doubleValue];
}
double averageSalary = totalSalary / [employees count];

答:[employees valueForKeyPath:@"@avg.salary"];

1966

你可能感兴趣的:(Object-c,xcode,ios,IOS)