iOS面试问题🤯😖😒
1.我们在Objective-C中有扩展吗?
答案是肯定的。
2.目标C中类别和扩展名之间的区别?
可以为任何类声明一个类别,即使您没有原始的实现源代码。
类扩展与类别具有某些相似性,但是只能将其添加到您在编译时拥有源代码的类中(该类与该类扩展同时进行编译)。
类别使您可以在主界面文件之外添加方法。 而扩展名必须在主接口文件中实现。 这意味着我们可以确定,您不能使用扩展来扩展内置类或没有源代码的类,而应该使用类别。 要使用扩展,您需要访问要扩展的类的源。
3. Fallthrough关键字很快?
在Swift中, switch
语句不会落入每种情况的底部而进入下一种情况。 即,第一个匹配的情况一旦完成,整个switch
语句就完成其执行。
快速地,在切换案例中使用fallthrough语句来执行case语句,根据我们的要求,case语句位于匹配的case语句旁边。
fallthrough
关键字不检查导致执行陷入的switch
条件的条件。fallthrough
关键字仅导致代码执行直接移至下一个case(或default
case)块内的语句,就像C的标准switch
语句行为一样。
4.如何使协议中的方法快速可选?
我们可以通过两种方式做到这一点。
纯快捷方式应类似于使用protocol extension
提供默认实现。
目标— C兼容性的方式是使用@objc
和optional
关键字。
重要: objc的缺点-兼容性方式是上MyProtocolObjc
中的 MyProtocolObjc
成为一个类-仅协议 。 结构不符合该协议。
错误: 非类类型’SomeStruct’不符合类协议’MyProtocolObjc’
5.反转字符串而不使用“ reversed()”内置函数
如果面试官要求您将代码写在纸上,请当场杀死他。 对我来说,没有xcode编写优化代码真的很困难。
上次问这个问题时,这是我首先想到的。[笔和纸的方法]。
扩展字符串{
func reverse()->字符串{
var tempString =“”
对于自我中的字符{
tempString =字符串(char)+ tempString
}
返回tempString
}
}
我能够剪切-使用Playgrounds
将其拍摄到Playgrounds
。 您可以在字符串上使用高阶函数“ Reduce ”来实现此逻辑。 🔥🔥🔥🔥🔥
extension String {
func reverse() -> String { return self.reduce(""){ "\($1)" + $0 } }
}
6.解释UIButton的类层次结构。
NSObject→UIResponder→UIView→UIControl→UIButton。
UITextField,UITextView,UISlider,UIDatePicker,UIPageControl,UISegmentedControl,UIStepper,UISwitch等均从UIControl继承。
每个超类的角色和责任是什么?
UIResponder :一个负责响应和处理事件的抽象类。 响应者实现touchesBegan(_:with:)
, touchesMoved(_:with:), first responder
处理,键盘以及与输入有关的事件等。
UIView :一个对象,用于管理屏幕上矩形区域的内容。
UIControl :它是控件的基类。
- 它处理控制状态,如启用,禁用,集中,突出显示等。
- 它处理事件如touchDown,touchupInside,valueChanged,编辑UITextField的事件等。
- 添加目标,删除目标,处理操作等
7. UIViewController的超类?
UIResponder→UIViewController
8. UIWindow的超类?
UIView→UIWindow
9. iOS应用程序有多少个窗口?
一个iOS应用一次只能有一个活动密钥窗口。
苹果医生说 :每个应用程序都有至少一个窗口,在设备主屏幕上显示该应用程序的用户界面。 如果将外部显示器连接到设备,则应用程序可以创建第二个窗口以在该屏幕上显示内容。
10.自我和Swift中的自我之间的区别?
“自”仅在协议中或作为类中方法的结果可用。
参考:快速黑客入侵。
在编写协议和协议扩展时, Self
(大写S)和self
(小写S)之间是有区别的。 与大写S一起使用时, Self
是指符合协议的类型,例如String
或Int
。 当与小写S一起使用时, self
是指该类型内的值,例如“ hello”或556。
注意: BinaryInteger
是一个协议。
扩展BinaryInteger {
func squared()-> 自我 {返回自我 * 自我 }
}
11. Swift类中的静态函数与类函数/变量之间有什么区别?
static
和class
都将方法/属性与类而不是类的实例相关联。 不同之处在于子类可以覆盖class
方法。 他们不能覆盖static
方法。 因此,在Class中,static函数关键字可以写为:
最后一课someFunction()
因此,static在内部是最终的。
静态方法是静态调度,这意味着编译器知道在运行时将执行哪个方法,因为静态方法不能被覆盖,而类方法可以是动态调度,因为子类可以覆盖这些方法。
12.解释final关键字或…如何防止类中的覆盖和子类化?
您可以通过将方法,属性或下标标记为final来防止其被覆盖。 为此,可以在方法,属性或下标的Introductionr关键字(例如final var
, final func
, final class func
和final subscript
)之前编写final
修饰符。
您可以通过在类定义中的class
关键字之前编写final
修饰符,将整个类标记为final。 任何试图将最终类作为子类的尝试都将报告为编译时错误。
如前所述,您还可以使用static
关键字,它具有final class
。
参考:StackOverflow
13.解释Objective-C和Swift的原子性?
目标中的默认值-C: 原子
Swift中的默认值: 非原子
将属性定义为原子属性将保证将返回有效值。 声明atomic
属性使编译器生成其他代码,从而阻止并发访问该属性。 此附加代码将锁定信号灯,然后获取或设置属性,然后解锁信号灯。 如果线程A同时调用B和C的getter,而线程C使用不同的值调用setter,则线程A可能会获得返回的三个值中的任何一个-调用任何setter之前的值,或者将其中一个值传递给B和C。同样,对象可能以B或C中的值结尾,无法分辨。
由于在设置/获取值之前和之后的锁定和解锁,原子属性遭受的性能影响较小。
非原子特性不能保证返回值。 它可以是正确的值,部分写入的值或什至是垃圾值。
在Swift中没有原子/非原子关键字。 当多个线程尝试访问相同的值时,我们应该使用锁/信号量等使属性变为原子。
原子性属性(原子和非原子)没有反映在相应的Swift属性声明中,但是从Swift访问导入的属性时,Objective-C实现的原子性保证仍然有效。
14.什么是单例模式? 如何快速创建一个?
一个Singleton在其存在的应用程序生存期内只能有一个实例。Singletons存在是为了给我们提供单一的全局状态。 这样的示例是NSNotificationCenter
, UIApplication
和NSUserDefaults
。
期末课程Singleton {
静态让sharedInstance = Singleton()
private init(){} //初始化应该是私有的
}
用let关键字声明的任何变量都是常量 ,因此是只读且线程 安全的。
静态关键字确保它在dispatch_once块中延迟初始化。 默认情况下,Static在内部为final。
dispatch_once:在应用程序的生存期内仅执行一次块对象。
将init方法设为私有,以便没有人可以直接访问init()方法并创建Singleton类的新实例。
15.枚举可以存储属性吗?
枚举可以具有方法,下标和计算的属性。 但是它不能具有存储的属性。
16.是否可以在没有付费开发人员帐户的情况下在真实设备上安装iOS应用程序?
是的你可以。 但是,如果不注册Apple Developer Program,则您的应用程序在您的设备上只能使用7天。 之后,您将必须通过Xcode将其重新部署到设备上。 如果您注册了Apple Developer Program,则不会有任何不便。
17.我们可以让自己变得虚弱吗
不,“弱”必须是可变变量,因为它可能在运行时更改。 当我们声明弱点时,它成为可选的。 它可能有值也可能没有值。 一旦没有引用,它将被突变[设置为nil]。
类 SomeClass {}
class SomeOtherClass {
弱者 让 someClassObj:SomeClass? = 无
//错误: “弱”必须是可变变量,因为它可能在运行时更改
}
18.我们可以无人租借吗
是。 无主引用将始终具有价值。 这不是可选的。
注意:UNOWNED引用可以是let或var。
请享用!!。 我将在本文中添加更多问题。 跟随我,这样您就不会错过任何一个。
如果您喜欢阅读这篇文章,请分享并给予一些鼓掌,以便其他人可以找到它👏👏👏👏👏!!!!
您可以在Medium上关注我以获取新文章。 另外,在LinkedIn上与我联系。
如果您有任何评论,问题或建议,请随时在下面的评论部分中发布它们!