kysonyangs

Stay Hungry, Stay Foolish


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

  • 搜索

使用 Xcode 工具(Network Link Conditioner)模拟网络状态

发表于 2018-10-13 | 更新于 2020-05-17 | 阅读次数:

当在和服务器进行接口调试时,有的时候网络不好,接口返回慢,这个不好调试,但是 Apple 为我们提供了一款工具,让我们可以很方便的进行挖网络状态的模拟.

安装 Additional Tools 下载

我们使用 Additional Tools for Xcode 工具来进行网络状态的模拟测试.

下载完毕 打开 DMG -> Hardware -> 双击 Network Link Conditioner.prefPane 添加到偏好设置里。

选择 ON 打开 Network Link Conditioner , 就可以模拟网络状态了

阅读全文 »

Runtime03 Method

发表于 2018-06-23 | 更新于 2020-05-17 | 阅读次数:
  • class_rw_t里面的methods、properties、protocols是二维数组,是可读可写的,包含了类的初始内容、分类的内容

  • class_ro_t里面的baseMethodList、baseProtocols、ivars、baseProperties是一维数组,是只读的,包含了类的初始内容


阅读全文 »

Runtime02 NSObject与isa

发表于 2018-06-23 | 更新于 2020-05-17 | 阅读次数:

NSObject底层

看下NSObject中的定义:

1
2
3
@interface NSObject <NSObject>
Class isa;
@end

其实NSObject就是一个Class对象,不过是对变量isa封装了一系列的操作而已,那么Class又是什么类型呢?在objc-runtime-new.h可以找到其定义,是指向结构体objc_class的指针,如下:

阅读全文 »

Runtime01 类与元类

发表于 2018-06-23 | 更新于 2020-05-16 | 阅读次数:

来看一张经典的描述 isa 和 superclass 指向的图。

从这我们可以看到:

isa

  • instance的isa指向class
  • class的isa指向meta-class
  • meta-class的isa指向基类的meta-class

superclass

  • class的superclass指向父类的class
    如果没有父类,superclass指针为nil
  • meta-class的superclass指向父类的meta-class
    基类的meta-class的superclass指向基类的class

方法调用

  • instance调用对象方法的轨迹
    isa找到class,方法不存在,就通过superclass找父类
  • class调用类方法的轨迹
    isa找meta-class,方法不存在,就通过superclass找父类
阅读全文 »

Runtime相关

发表于 2018-06-22 | 更新于 2020-05-13 | 阅读次数:

Runtime 是什么?

Runtime 又叫运行时,是一套由 C、C++ 会和编写的一套 API,为OC加入了面向对象与运行时机制。

Objective-C 是一门动态语言,它会将一些工作放在代码运行时才处理而并非编译时。也就是说,有很多类和成员变量在我们编译的时是不知道的,而在运行时,我们所编写的代码会转换成完整的确定的代码运行。

KVO 实现原理

简单理解

  1. KVO是基于runtime机制实现的
  2. 当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的 setter 方法。派生类在被重写的 setter 方法内实现真正的通知机制
  3. 如果原类为Person,那么生成的派生类名为 NSKVONotifying_Person
  4. 每个类对象中都有一个 isa 指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将 isa 指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的 setter 方法
  5. 键值观察通知依赖于NSObject 的两个方法: willChangeValueForKey: 和 didChangevlueForKey:;在一个被观察属性发生改变之前, willChangeValueForKey:一定会被调用,这就 会记录旧的值。而当改变发生后,didChangeValueForKey:会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。
阅读全文 »

线程安全、锁

发表于 2018-06-20 | 更新于 2020-05-17 | 阅读次数:

nonatomic 与 atomic

  • nonatomic: 不会对生成的 getter、setter 方法加同步锁(非原子性)
  • atomic: 会对生成的 getter、setter 加同步锁(原子性)
    setter / getter 被 atomic 修饰的属性时,该属性是读写安全的。然而读写安全并不代表线程安全。
阅读全文 »

iOS设备信息

发表于 2018-06-13 | 更新于 2020-05-17 | 阅读次数:

为了统计用户信息、下发广告,服务器端往往需要手机用户设备及app的各种信息,整理一下各种信息的获取方式:

阅读全文 »

Playground使用

发表于 2018-06-08 | 更新于 2020-05-17 | 阅读次数:

Sources 目录

通常情况下,我们直接在 Playground 上面写代码,然后编译器会实时编译我们代码,并将结果显示出来。这很好,我们可以实时得到代码的反馈。

但是这也会产生一个问题,如果我们写了一个函数,或者自定义了一个 view,这部分代码一般情况下是不会变的,而编译器却会一次又一次地去编译这些代码,最终的结果就是导致效率的低下。

这时,Sources 目录就派上用场了,使用 Cmd + 1 打开项目导航栏(Project Navigator),可以看到一个 Sources 目录。放到此目录下的源文件会被编译成模块(module)并自动导入到 Playground 中,并且这个编译只会进行一次(或者我们对该目录下的文件进行修改的时候),而非每次你敲入一个字母的时候就编译一次。 这将会大大提高代码执行的效率。

注意:由于此目录下的文件都是被编译成模块导入的,只有被设置成 public 的类型,属性或方法才能在 Playground 中使用。

阅读全文 »

LLDB调试

发表于 2018-05-25 | 更新于 2020-05-17 | 阅读次数:

LLDB是XCode内置的为我们开发者提供的调试工具,它与LLVM编译器一起,存在于主窗口底部的控制台中,能够带给我们更丰富的流程控制和数据检测的调试功能。在调试过程中熟练使用LLDB,可以让你debug事半功倍。

LLDB可以带来以下体验:

  • 允许你在程序运行的特定时暂停它
  • 查看变量的值
  • 执行自定的指令
  • 按照你所认为合适的步骤来操作程序的进展
  • More
阅读全文 »

YYModel使用

发表于 2018-04-25 | 更新于 2020-05-17 | 阅读次数:

简单的 Model 与 JSON 相互转换

1
2
3
4
5
6
7
8
9
10
11
12
13
// JSON:
{
"uid":123456,
"name":"Harry",
"created":"1965-07-31T00:00:00+0000"
}

// Model:
@interface User : NSObject
@property UInt64 uid;
@property NSString *name;
@property NSDate *created;
@end

JSON <--> Model

1
2
3
4
5
// 将 JSON (NSData,NSString,NSDictionary) 转换为 Model:
User *user = [User yy_modelWithJSON:json];

// 将 Model 转换为 JSON 对象:
NSDictionary *json = [user yy_modelToJSONObject];

阅读全文 »
1234…6

kysonyangs

kysonyangs个人站,备忘

54 日志
13 标签
GitHub
© 2015 — 2020 kysonyangs
由 Hexo 强力驱动 v3.7.1
|
主题 — NexT.Mist v6.3.0