关于ios:iOS精选面试题基础篇

40次阅读

共计 2084 个字符,预计需要花费 6 分钟才能阅读完成。

面试题目都是网上收集,答复是本人尝试答复,网上的很多答复我感觉不肯定对,会本人批改,有问题心愿能够及时指出来

1.Object-c 的类能够多重继承么?能够实现多个接口么?Category 是什么?重写一个类的形式用继承好还是分类好?为什么?

1.OC 没有多重集成
2. 但能够遵循多个协定也就是 protocol
3.Category 是类别
4. 重写一个类的形式,用继承好还是分类好?为什么?
这个问题中“重写”和“形式”这两个词就很奇怪,这个类如果是你本人写的,对不称心的中央间接批改就能够了,干嘛要继承和分类退场呢?即便这个类你没源码,然而你对这个类各种不称心,你要重写一个类代替,也跟继承和分类没间接关系啊。
我从两个方向去尝试猜想下这道面试题的意思,
猜想 1:“形式”改为“”办法“,面试官是想问重写一个类的办法,用继承好还是分类好?这里网上的很多答复曾经重大不对了,例如网上大多答复是这样的:

个别状况用分类好,用 Category 去重写类的办法,仅对本 Category 无效,不会影响到其余类与原有类的关系

这个答复如果回答者的意思是说如果其余类没有引入这个分类,就不会调用到分类的实现,还会是这个类原有的实现,就打错特错了,实际上如果只有你分类笼罩了这个类的某个办法的实现,你在工程中即便不引入这个分类,也都会调用到分类的实现。
咱们能够写代码试下:咱们先新建一个工程,而后写一个 Test 的类,间接继承 NSObject 就好,而后咱们定义了两个办法,一个办法让分类间接笼罩,一个分类间接笼罩真正的实现

- (NSString *)whoAmI; // 让分类间接笼罩

- (void)indirectMethodTest; // 分类笼罩间接的办法

实现代码如下

- (NSString *)whoAmI {return @"Test";}

- (void)indirectMethodTest {[self iAmDirect]; // 真正调用的是 iAmDirect
}

- (void)iAmDirect {NSLog(@"iAmDirect Test");
}

而后咱们让分类别离实现,“whoAmI”和“iAmDirect”

- (NSString *)whoAmI {return @"Test+Change";}

- (void)iAmDirect {NSLog(@"iAmDirect Test+Change");
}

咱们在管制其中不引入类别只引入 Test.h

控制器 viewDidLoad 退出如下代码

    Test *test = [Test new];
    
    NSString *string = [test whoAmI];
    NSLog(@"string = %@", string);
    
    [test indirectMethodTest];

而后控制台打印下这两个办法的后果


能够发现即便你没引入类别,这个类的实现,也会被分类的办法替换掉,具体起因,能够看下分类的实现原理,我当前会具体说下,简略来说就是 runtime 把 categoray 实现的办法,放在了原来类办法的后面,这样必然每次都会先找到分类的办法。不过要记住分类只会笼罩这个类的原有实现,对子类是不会笼罩的,这个是 msgsend 的调用流程决定的。
所以针对猜想 1,重写一个类的办法来说,我感觉用继承最好,除非你真的感觉这个原来的办法没救了,你要一劳永逸的替换原有类的实现,而且不想批改应用到这个办法的其余类的代码了,你也曾经告诉了你在的开发组共事了,你能够去这么做,不过这种形式切实不明智,连苹果都给了正告不要这么做

”Category is implementing a method which will also be implemented by its primary class“

用继承的形式则要好的多:
1. 你用子类重写这办法之后,你只须要在不称心的中央,用子类替换即可,不须要改的中央,还能够持续应用以前的类。
2. 能够应用 super 调用这个类的原来的实现前后,子类做一些批改,因为子类的 super 指向的是这个类,而类别的 super,指向的是还是这个类的父类,因为类别毕竟不是继承啊。

猜想 2:重写改为扩大,面试官想问:扩大一个类的形式,用继承好还是分类好?为什么?
这个好答复很多,就是问继承和分类的区别,优劣势。
继承:
1. 要重写原来类中的办法,但父类的这个办法也想持续应用。
2. 减少成员变量,属性

类别:
1. 零碎特定类没法继承,重点说的就是类簇,比方 NSString,NSArray,NSNumber 等,这些返回的实在的类,都是一些公有暗藏的类,如果继承,将相当麻烦。相同应用类别去扩大一些性能,将不便很多。
2. 用分类,将一些简单的类,按性能将的办法拆分到独自的文件中,能够进步可维护性,iOS 零碎中的类就常常这么做。例如把 NSObject 延时执行的办法例如:

(void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay

等办法放到了 runloop 文件中,因为这些办法 runloop 相干的。

继续更新中。。。

正文完
 0