行业知识
IOS面试题object-c 11-20
| 11、解释self = [super init]方法? |
| 容错处���, 当父类初始化失败,会返回一个nil, 表示初始化失败。 ()由于继承的关系, 子类是需要拥有父类的实例和行为, 因此, 我们必须先初始化父类,然后再初始化子类 |
| 12、简述使用block有什么优点? |
| 代码紧凑,传值、回调都很方便,省去了写代理的很多代码。 |
| NSTimer封装成的block,具体实现实现方法: ()NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES callback:^() { weakSelf.secondsLabel.text = ... } [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; |
| 13、 Object-C中是否有二维数组,如何实现二维数组? |
| 在实际的项目开发中,二维数组也是常常用到的数据结构。 OC中的二维数组也是通过一维数组来建立的,今天我们来详解一下如何在OC中使用二维数组。 使用NSArray初始化的一维数组和二维数组都是不可变数组。 |
| #import int main(int argc, const char * argv[]) { @autoreleasepool { //定义2个一维数组; NSArray *firstRow = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil]; NSArray *secondRow = [[NSArray alloc] initWithObjects:@"4",@"5",@"6", nil]; //使用一维数组来初始化二维数组; NSArray *my2DArray = [[NSArray alloc] initWithObjects:firstRow,secondRow, nil]; //输出二维数组对象; NSLog(@"二维数组:%@",my2DArray); //遍历二维数组; for (int i = 0; i for (int j = 0; j NSLog(@"二维数组元素:%@",[[my2DArray objectAtIndex:i] objectAtIndex :j]); } } } return 0; } |
| 14、简述property属性的修饰符的作用? |
| getter=getName、setter=setName:设置setter与getter的方法名; |
| readwrite、readonly:设置可供访问级别; |
| assign:方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题; |
| retain:其setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序; |
| copy:其setter方法进行copy操作,与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1。 这是为了减少对上下文的依赖而引入的机制。 |
| nonatomic:非原子性访问,不加同步, 多线程并发访问会提高性能。 注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问 |
| 15、 将字符串“2015-04-10”格式化日期转为NSDate类型 |
| NSString *timeStr = @"2015-04-10"; dispatch_async(dispatch_get_global_queue(0, 0), ^{ if (!isCanceled) { block(); } }); return cb; } |
| 在本例中,如果 block 执行中的代码是通过参数传递进来的话,似乎并没有什么办法可以修改它了 |
| 19、简述IOS __block和__weak修饰符的区别? |
| 1、__weak: __weak只能在ARC下使用,且只能修饰对象,不能修饰基本数据类型(int等),弱引用,可以block解决循环引用问题。 |
| 2、__block: __block既能再ARC下使用,也能在 MRC下使用。既能修饰对象又能修饰基本数据类型。 |
| ARC、MRC区别:__block对象在ARC下可能会导致循环引用,非ARC下会避免循环引用。 |
| ARC、MRC共同点:block内对于栈上的数据不能修改,使用__block修饰以后放到了堆上就可以修改了。 |
| 20、解释单例的写法在单例中使用数组要注意什么? |
| static PGSingleton *sharedSingleton; + (instancetype)sharedSingleton { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedSingleton = [[PGSingleton alloc] init]; }); return sharedSingleton; } |
| 其实上面的还不是标准的单例方法,标准的单例方法需要重写 copyWithZone,allocWithZone,init,确保以任何方式创建出来的对象只有一个,这里就不详细写了。 |
| 单例使用 NSMutableArray 的时候,防止多个地方对它同时遍历和修改的话,需要加原子属性。 并且property用strong,并且写一个遍历和修改的方法。 加上锁. Lock,UnLock.(PS:考虑性能问题尽量避免使用锁,在苹果的文档张看到的不要问我为什么,我也忘了自己查去。。) |
上一篇:测试下载速度的方法与技巧