0%

工程中QuoteUtil文件夹阅读笔记

[toc]

基本信息

目录结构:

.
├── ColorManager
├── FTEmptyTableViewCell.h
├── FTEmptyTableViewCell.m
├── FTEmptyTableViewCell.xib
├── FTQuoteAlertUtil.swift
├── FTQuoteCustomEmptyFailedView.h
├── FTQuoteCustomEmptyFailedView.m
├── FTQuoteCustomEmptyNoDataView.h
├── FTQuoteCustomEmptyNoDataView.m
├── FTQuoteCustomLoadingEmptyDataSetView.h
├── FTQuoteCustomLoadingEmptyDataSetView.m
├── FTQuoteCustomLoadingView.h
├── FTQuoteCustomLoadingView.m
├── FTQuoteStockNewsMiniView.h
├── FTQuoteStockNewsMiniView.m
├── FTQuoteUtil.h
├── FTQuoteUtil.m
├── FTSensorsTimeTrackManager.h
├── FTSensorsTimeTrackManager.m
└── UIImage+Share.swift

模块对应组件

上面这些代码对应的都是牛牛中的什么组件?其实看名字也能猜出个大概,文件名中很多都有Empty字眼,猜测是没网时数据加载不出来需要展示的组件。

怎么去找呢?

  1. 在你想要找到这个模块中打一个断点,根据名字猜测出大概的位置,然后在模拟器上多点几下试试,如果当前页面触发了断点,那么该页面就调用了此代码模块对应的组件,打开牛牛bate版,找到对应的页面,摇一摇打开3D视图,就能很清楚的看到这个组件的信息了。
  2. 同时牛牛也是一个庞大的工程,如果像无头苍蝇一样乱点的话,可能点半天也找不到对应的组件,那就要从代码里面的注释去抓敏感信息。

对应第一个方法:以下图片为 FTQuoteCustomLoadingEmptyDataSetView 对应的组件

阅读全文 »

单元测试学习笔记

[toc]

理论知识

为什么需要单元测试?

  • 迫使从调用者的角度去思考,从而优化代码结构使其可测试性高
  • 更细致地去测试代码,提高代码的健壮性

单元测试(Unit Test)

一个单元测试是一段测试代码,这段测试代码调用生产代码的一个工作单元(如一个方法),并检验该工作单元的一个具体的最终结果。

如果关于这个最终结果的假设不成立,那这个单元测试就失败了。

阅读全文 »

Swift学习笔记

[toc]

常量和变量

常量的值一旦设定就不能改变,而变量的值可以随意更改。

声明常量和变量

let height = 188
var weight = 120

这两行代码可以理解为,声明一个名字为 height 的常量,并给它赋值为 188,然后声明一个名字为 weight 的变量,并给它赋值为 120。

如果你的代码中有不需要改变的值,使用 let 关键字将它声明为常量,只将需要改变的值声明为变量,这样会使你的代码更加合理。

与变量不同,常量的值一旦被确定就不能更改了。尝试这样做会导致编译时报错:

let height = 188
height = 199
// 这会报编译时错误 - height 不可改变

你可以在一行中声明多个常量或者多个变量,用逗号隔开:

var x = 0, y = 1, z = 2
阅读全文 »

iTerm2终端神器快速安装教程(自定义主题+高亮+智能补全……)

[toc]

一、iTerm2的获取

  • Iterm可以用来替换掉默认终端。
  • 官网下载 iterm2.com
  • 下载之后安装

然后设为默认终端

image-20220715150242429

二、 Oh My Zsh

Oh My Zsh 是对主题的进一步扩展,

使用 curl 安装 Oh My Zsh

sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
阅读全文 »

OC纯代码仿写微信首页记录文档

[toc]

0.前置知识

  • 视图和控件

大致了解iOS 中的视图和控件的作用,苹果官方文档

一般APP的界面结构就是使用 导航栏 + 根视图+ 标签栏 构成的。

UIWindow 是一种特殊的 UIView,通常在一个 app 中只会有一个 UIWindow,iOS 程序启动完毕后,创建的第一个视图控件就是 UIWindow,接下来再创建其他控件。所以在 AppDelegate 中的 didFinishLaunchingWithOptions 方法中,先创建 UIwindow,再创建控制器,创建控制器的 view,然后将控制器的 view 添加到 UIWindow 上。

UITabBarController 选项卡控制器,与导航控制器一样,也被广泛用于各种ios应用程序。顾名思义,选项卡控制器在屏幕底部显示一系 “选项卡”,这些选项卡表示为图标和文本,用户触摸它们将在不同的场景间切换。和 UINavigationController 类似,UITabBarController 也可以用来控制多个页面导航,用户可以在多个视图控制器之间移动,并可以定制屏幕底部的选项卡栏。

UINavigationController 栈视图控制器,它必须设置一个 RootViewController 根控制器,页面跳转时,通过它将下一个子 ViewController 的视图添加到RootViewController 的视图中。

阅读全文 »

记录删除storyboard用纯代码布局

[toc]

目录变化

首先来看一下 Xcode13 创建项目的目录,比之前的旧版本多了 SceneDelegate.h 和 SceneDelegate.m 两个文件

image-20220708113229940

SceneDelegate

从 Xcode11开始,创建新的iOS项目的模版中会带有 SceneDelegate 类,并且在 plist 文件中会有一个 Application Scene Manifest 配置,AppDelegate.m 中新增了两个管理 SceneDelegate 的函数 ,分别是 application(_:configurationForConnecting:options:)application(_:didDiscardSceneSessions:)

SceneDelegate.h 和 SceneDelegate.m 两个文件这两个文件一般用于 ipadOS 的分屏功能的。

阅读全文 »

OC 中的 block

[toc]

块对象(block)不是 OC 的特性而是 C 语言的实现,用一句话来概括 block:带有自动变量(局部变量)的匿名函数,在其他编程语言中,它与闭包(closure)的功能相同。

代码块的定义:

void (^myBlock)(void);

使用 typedef 关键字简化 block 的定义

//定义
typedef int (^myBlock)(int a, int b);
//使用
myBlock fun1 = ^(int a, int b){
  return a * b;
};

代码块的几种使用形式

阅读全文 »

类别、扩展和协议

[toc]

OC 中的类别(Category)

类别的定义

实现某个类的一部分方法的模块叫做类别。类别可以将有很多方法的超大型的类,分散到不同的模块之中。类别本是 smalltalk 中的概念,用于将多个方法按照相互关系、用途等特征分类,以便最快速的找到自己想要的方法。

调用类别中的方法和调用普通类中的方法是一样的,类别和类一样,都是在接口文件中声明,在类文件中实现,但类别中不能声明实例变量,只能声明方法,声明的方法可以是类方法也可以是实例方法。

类别的声明

@interface 类名(类别名)
方法的声明;
...
@end

类别的定义

@implemention 类名(类别名)
方法的定义;
...
@end
阅读全文 »

OC 中的数据存储

[toc]

plist 文件

属性列表

C 提供了 open()、read()、write()、fopen()、fread() 这些函数创建、读取和写入文件

而 Cocoa 提供了两个处理文件的通用类:属性列表和对象编码

在 Cocoa 中有一类名为属性列表(property list)的对象,简写为 plist。这些对象用来存放一些 Cocoa 能够处理的对象,比如NSArray、NSNumber、NSDictionary、NSString、NSData、NSDate 主要是将这些对象存储到文件中或从文件中加载。

下面来熟悉一下 NSDate 和 NSData 的使用。

NSDate 类是 Cocoa 中用来处理日期和时间的基础类,[NSDate date] 能够获取当前的日期和时间,它能够返回一个自动释放的对象。

NSDate *date = [NSDate date];
NSLog(@"today is %@", date); //today is Mon Jun 27 11:31:52 2022

NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow: -(24 * 60 * 60)];
NSLog(@"yesterday now is %@", yesterday); //yesterday now is Sun Jun 26 11:37:39 2022

NSDate *tomorrow = [NSDate dateWithTimeIntervalSinceNow: (24 * 60 * 60)];
NSLog(@"tomorrow now is %@", tomorrow); //tomorrow now is Tue Jun 28 11:37:39 2022
阅读全文 »

从C++到OC,快速掌握 OC语法

[toc]

学习Objective-C 的笔记,有 C/C++ 基础的同学阅读文章此可以快速掌握 OC。

Xcode 快捷键

格式化代码:Command + A 全选(选中需要格式的代码段) 再 Ctrl + i 格式化代码

C 和 OC 的区别

由于 OC 的底层是 C 语言,所以 OC 和 C 完全兼容,在编程过程中,OC 和 C 可以混合使用。

分析一下一段最基本的 OC 代码:

#import <Foundation/Foundation.h>

int main() {
    NSLog(@"Hello, World!");
    return 0;
}
阅读全文 »