2024年Web前端最全iOS 逆向编程(十四)Cycript 语法入门(1),vivo前端面试题

总结

面试前要精心做好准备,简历上写的知识点和原理都需要准备好,项目上多想想难点和亮点,这是面试时能和别人不一样的地方。

还有就是表现出自己的谦虚好学,以及对于未来持续进阶的规划,企业招人更偏爱稳定的人。

万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

前端面试题汇总

JavaScript

前端资料汇总

@“<NMApplication: 0x113d4d710>”

cy# UIApp

#“<NMApplication: 0x113d4d710>”

  • 获取 keyWindow 对象(OTTouchObservingWindow 其实就是 UIWindow,只是编译之后 iOS 内部做了转换)。

cy# UIApp.keyWindow

#“<OTTouchObservingWindow: 0x10a65b610; baseClass = UIWindow; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x281ac01e0>; layer = <UIWindowLayer: 0x28146e0a0>>”

  • 获取 rootViewController

cy# UIApp.keyWindow.rootViewController

#“<NMRootNavigationController: 0x10a8cd400>”

四、内存地址访问对象
  • 获取到 keyWindow 的内存地址 0x10a65b610

cy# UIApp.keyWindow

#“<OTTouchObservingWindow: 0x10a65b610; baseClass = UIWindow; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x281ac01e0>; layer = <UIWindowLayer: 0x28146e0a0>>”

可以通过 #0x10a65b610 这种方式通过内存地址访问这个对象,你会发现跟上面输出 的对象是一样的:

cy# #0x10a65b610

#“<OTTouchObservingWindow: 0x10a65b610; baseClass = UIWindow; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x28043da10>; layer = <UIWindowLayer: 0x280af58a0>>”

也可以通过内存地址的方式获取该对象下面的其他属性值:

cy# #0x10a65b610.rootViewController

#“<NMRootNavigationController: 0x10a8cd400>”

五、ObjectiveC.classes 获取已加载的所有OC类
  • ObjectiveC.classes:你可以理解成获取列出来所有的 .h 头文件或者 class 对象,就是列出当前已经加载所有类。

cy# ObjectiveC.classes

{

// 系统类

__NSGenericDeallocHandler:__NSGenericDeallocHandler,NSZombie:NSZombie,__NSMessageBuilder:__NSMessageBuilder,…

// 自定义类

RMLog:RMLog,NMSearchShowCell,NMSearchPlaylistCell:NMSearchPlaylistCell,NMDjRadioPurchaseProgramCell:NMDjRadioPurchaseProgramCell,…

}

这样一看做 iOS 都知道啥意思了,都是类名,自定义类,Cell 之类的。

六、查看对象的所有成员变量
  • 在后面经常会需要知道 某个对象 里面有哪些成员 变量 或者 属性

  • 只需要在对象前面加个 * 号即可,例如:*UIApp :

cy# *UIApp

{isa:NSKVONotifying_NMApplication,_hasOverrideClient:0,_hasOverrideHost:0,_hasInputAssistantItem:0,_delegate:#“<NMAppDelegate: 0x2838b2010>”,_event:#“<UIEvent: 0x2804cdce0>”,_motionEvent:#“<UIMotionEvent: 0x2831b4d00> timestamp: 0 subtype: 0”,_remoteControlEvent:#“<UIRemoteControlEvent: 0x28149b1c0>”,_remoteControlEventObservers:1,_topLevelNibObjects:null,_networkResourcesCurrentlyLoadingCount:0,_hideNetworkActivityIndicatorTimer:null,_editAlertController:null,_statusBar:#“<UIStatusBar: 0x10a863800; frame = (0 0; 320 20); opaque = NO; autoresize = W+BM; layer = <CALayer: 0x280a8ab20>>”,_statusBarRequestedStyle:0,_statusBarWindow:#"<UIStatusBarWindow: 0x10a6561d0; frame = (0 0; 320 568); opaque = NO; gestureRecognizers = <NSArray: 0x280438930>; …}

上面的所有属性都是以 , 逗号分开,每一个逗号就是一个成员变量。

挑个出来看看,比如 代理属性,前面是 属性名称,后面是

_delegate:#“<NMAppDelegate: 0x2838b2010>”

七、递归打印 View 的所有子控件
  • iOS 开发中,可以通过 控制台 LLDB 打断点后 po 的方式递归输出指定视图的所有子控件。

  • 语法 po [self.view.window recursiveDescription]

(lldb) po [self.view.window recursiveDescription]

<UIWindow: 0x7f9f8b618460; frame = (0 0; 375 667); gestureRecognizers = <NSArray: 0x60000077a1c0>; layer = <UIWindowLayer: 0x600000926de0>>

| <UITransitionView: 0x7f9f8b719630; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x60000093b300>>

| | <UIDropShadowView: 0x7f9f8b71a060; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x60000093b280>>

| | | <UIView: 0x7f9f8b719ef0; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x60000093b2c0>>

<UIWindow: 0x7f9f8b618460; frame = (0 0; 375 667); gestureRecognizers = <NSArray: 0x60000077a1c0>; layer = <UIWindowLayer: 0x600000926de0>>

| <UITransitionView: 0x7f9f8b719630; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x60000093b300>>

| | <UIDropShadowView: 0x7f9f8b71a060; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x60000093b280>>

| | | <UIView: 0x7f9f8b719ef0; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x60000093b2c0>>

  • Cycript 里面递归输出子控件,其实也是使用 recursiveDescription

cy# [UIApp.keyWindow recursiveDescription]

cy# [UIApp.keyWindow recursiveDescription].toString()

由于输出太多我就不贴了,跟上面 iOS 中一样,一层一层的列出来。一种是递归列出所有子控件,一种是将列出的子控件转成字符串输出,两者没什么区别,就是排版的区别,都可以。

七、choose 删选出指定类型的对象
  • 意思是:指定一个类,只要是继承或者等于这个类的都会被列出来,只会列出已加载到缓存中。

  • 例如 UIViewController,列出当前已加载到缓存是继承或者直接使用 UIViewController 的,网易云首页举例

cy# choose(UIViewController)

输出:

[#"<NMVoiceHomeViewController: 0x11a400200>",#"<NMSettingTabViewController: 0x11a404020>",#"<NMSingTabViewController: 0x11a407540>",#"<NMContainerViewController: 0x11a409ce0>",#"<NMContainerViewController: 0x11a414d60>",#"<NMMainViewController: 0x10a6d8780>",#"<NMContainerViewController: 0x10a5f5220>",#"<NMMineTabViewController: 0x10a5f6910>",#"<NMContainerViewController: 0x11a519390>",#"<NMContainerViewController: 0x11a52f3f0>",#"<NMTabBarController: 0x10b946000>",#"<NMNavigationController: 0x10b9a7000>",#"<NMNavigationController: 0x10b9cc400>",#"<NMNavigationController: 0x10b9d6c00>",#"<NMNavigationController: 0x10b9e0200>",#"<NMNavigationController: 0x10b9ea600>",#"<NMNavigationController: 0x10a83f400>",#"<NMRootNavigationController: 0x10a8cd400>",#"<NMNavigationController: 0x10a8e7200>",#"<NMNavigationController: 0x10a912a00>",#"<NMNavigationController: 0x10a919c00>",#"<NMNavigationController: 0x10a975800>"]

性能优化

1.webpack打包文件体积过大?(最终打包为一个js文件)

2.如何优化webpack构建的性能

3.移动端的性能优化

4.Vue的SPA 如何优化加载速度

5.移动端300ms延迟

6.页面的重构

所有的知识点都有详细的解答,我整理成了280页PDF《前端校招面试真题精编解析》。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值