0%

重要提醒

由于大家使用的网络和设备条件各不相同,无法保证按照该教程操作一定能成功😂 最近问的人比较多,所以做个统一整理,仅供参考~

  • 可能面临的财产损失(包括但不限于),请务必知悉:
    • 注册美区账号后,成功充值了礼品卡,但无法使用礼品卡购买ChatGPT Plus,且,已充值的服务卡不支持退费(损失礼品卡费用)。
    • 充值成功,但账号被ChatGPT官方检测为异常,导致账号被封禁(丢失账号+损失充值费)。
  • 教程来自网络搜集,部分操作可能随软件功能更新而失效,所以,想充值的请尽快~
  • 成功充值ChatGPT Plus后,就能同时在ChatGPT APP和ChatGPT网页端,使用GPT-4啦!
  • 每月费用:20美金
  • 一个观点:是否充值主要看个人需求,如果觉得3.5给出的答复已经令人满意,那就继续使用。如果感觉每月20刀也不算啥不愿负担的成本,那么不妨开上一月试试。
阅读全文 »

前言

在开始探究内存对齐原理之前,我们先来两个问题:

  1. 内存对齐原则是什么?
  • 数据成员对齐规则:结构体(struct)或联合体(union)的数据成员,第一个数据成员放在 offset 为 0 的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说数组、结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存储)
  • 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(strcut a里存有 struct b,b里有结构体char,int 等,那么b应该从8的整数倍开始存储)
  • 结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的需要补齐
阅读全文 »

在我们的日常开发的过程中经常会使用到alloc,init,new,这些方法,但是这些方法又是如何实现的呢?在他们当中又做了哪些事情呢?下面我们先来看一个例子:

1
2
3
4
5
6
GJPerson *objc1 = [GJPerson alloc];
GJPerson *objc2 = [objc1 init];
GJPerson *objc3 = [objc1 init];
NSLog(@"%@ - %p - %p", objc1, objc1, &objc1);
NSLog(@"%@ - %p - %p", objc2, objc2, &objc2);
NSLog(@"%@ - %p - %p", objc3, objc3, &objc3);

以上3条输出语句分别输出了3个对象的内容、内存地址、指针地址,他们的值又会是什么呢?是否相同呢?

阅读全文 »

  1. 在日常开发中我们经常会用到LLDB调试,比如:p xxx,po xxx,bt等等,这些调试命令的作用都是什么呢?
  2. 源码探索对于开发来说也是一件必须要掌握的事情,源码探索的方法又有哪些呢?

下面针对这两点,我们将一一进行解释说明!

阅读全文 »

创建私有pod库:

创建公有Pod库或者私有Pod库, 实际上原理是一样的, 都是基于git服务和repo协议, 不一样的是, 两者的版本索引查询方式不一样, 公有库的podspec由CocoaPods/Specs管理, 而内部私有使用的pod库需要自己建立一个仓库来管理podspec.

1
2
3
// 创建pod库
// 例如:pod lib create GJNotifyView
pod lib create [repo-name]
阅读全文 »

JKCategories(iOS-Categories)

JKCategories(iOS-Categories),一个有用的Objective-C类别的集合,扩展了iOS框架,如Foundation、UIKit、CoreData、QuartzCore、CoreLocation、MapKit等。

阅读全文 »