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兼容性的方式是使用@objcoptional关键字。

重要: 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是指符合协议的类型,例如StringInt 。 当与小写S一起使用时, self是指该类型内的值,例如“ hello”或556。

注意: BinaryInteger是一个协议。

 扩展BinaryInteger { 
  func squared()-> 自我 {返回自我 * 自我 } 
  } 

11. Swift类中的静态函数与类函数/变量之间有什么区别?

staticclass都将方法/属性与类而不是类的实例相关联。 不同之处在于子类可以覆盖class方法。 他们不能覆盖static方法。 因此,在Class中,static函数关键字可以写为:

 最后一课someFunction() 

因此,static在内部是最终的。

静态方法是静态调度,这意味着编译器知道在运行时将执行哪个方法,因为静态方法不能被覆盖,而类方法可以是动态调度,因为子类可以覆盖这些方法。

12.解释final关键字或…如何防止类中的覆盖和子类化?

您可以通过将方法,属性或下标标记为final来防止其被覆盖。 为此,可以在方法,属性或下标的Introductionr关键字(例如final varfinal funcfinal class funcfinal 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存在是为了给我们提供单一的全局状态。 这样的示例是NSNotificationCenterUIApplicationNSUserDefaults

 期末课程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上与我联系。

如果您有任何评论,问题或建议,请随时在下面的评论部分中发布它们!