自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

chaoguo1234的专栏

小蜜蜂,嗡嗡嗡

  • 博客(378)
  • 资源 (50)
  • 问答 (1)
  • 收藏
  • 关注

原创 NSMutableDictionary 的内存布局

有关的内存布局,可以参看。

2025-06-03 02:55:00 1047

原创 NSDictionary 内存布局

是iOS开发中经常用到的数据结构。熟悉的内部实现,有助于我们更好的使用它们。同时,在遇到相关崩溃,也能帮助我们更好的分析问题。

2025-06-02 04:38:00 564

原创 WebKit Inside: GPU 进程调试

从配置文件可以看到,这个配置的值默认是。进程可以正常调试了。

2025-04-11 00:39:00 206

原创 WebKit Inside: 渲染树

经过CSS的匹配,就要进入渲染树的构建。渲染树也叫树,因为渲染树上每一个节点,都是的子类。首先来看一下的继承类图。

2025-03-30 14:35:00 822

原创 WebKit Inside: px 与 pt

表示一英寸有多少点,这里的点是在打印时使用的单位。表示一英寸有多少像素,这里的像素是物理像素。语句中跳出,不做任何换算处理,属性值。不同的地方在于,最终的值不是支持存储。从右下角红框输出可知,当前正在处理。,从控制台的输出可以看到,这个值为。从左边调用栈可知,这个过程发生在。字号设置,不同的是,将字号单位从。是物理像素,还是逻辑像素?从代码可以看到,如果是。被直接存储下来使用。那么就可以得出结论,

2025-03-23 17:50:00 315

原创 WebKit Inside: CSS 的匹配原理

从HTML解析成DOM树;到CSS样式表的解析;再到CSS样式表的匹配时机;最后到CSS样式表的匹配过程。WebKit渲染前的处理过程已经结束。WebKit渲染树的构建正等着我们。写到这里,总算告一小段落。✿✿ヽ(°▽°)ノ✿完一小结,撒花!✿✿ヽ(°▽°)ノ✿。

2025-03-18 02:25:00 883

原创 dyld: 神秘的 __dso_handle

iOS动态链接器dyld中有一个神秘的变量__dso_handle:// dyld/dyldMain.cppstatic const MachOAnalyzer* getDyldMH(){#if __LP64__ // 声明 __dso_handle extern const MachOAnalyzer __dso_handle; return &__ds...

2024-11-19 03:01:00 319

原创 一文搞懂 ARM 64 系列: ADD(立即数版)

汇编中,加法指令很重要,因为它是执行其他很多指令的基础。同时,加法指令也会影响NZCV标志。有关NZCV的介绍,可以参看《一文搞懂 ARM 64 系列: ADC》。ARM64汇编中,ADD指令有3种形式,这里介绍第一种形式,也就是与立即数相加。1 指令语法ADD <Xd|SP>, <Xn|Sp>, #imm{, shift}{}里的内容表示是可选的。shift...

2024-11-15 01:35:00 700

原创 一文搞懂 ARM 64: AUTIBSP

1 PAC有关PAC可以参看《一文搞懂 ARM 64: PACIBSP》。2 指令语法AUTIBSP3 指令语义上面指令对寄存器X30或者说寄存器LR的值进行PAC验证。指令AUTIBSP的B代表使用密钥B,同时SP表示「上下文」使用寄存器SP的值。下面是一个运行AUTIBSP后,X30的值的变化例子:// 验证前(lldb) p/x $x30(unsigned long) ...

2024-11-13 02:04:00 350

原创 一文搞懂 ARM 64 系列: PACISB

1 PACAMR64提供了PAC(Pointer Authentication Code)机制。所谓PAC,简单来说就是使用存储在芯片硬件上的「密钥」,一个「上下文」,与「指针地址」进行加密计算,得出一个「签名」,将这个「签名」写入指针的高bit上。计算出来的「签名」之所以可以写入指针的高bit,是因为在实际使用中,并不是所有指针64bit都会被使用,通常高bit都会被保留用来做其他用途...

2024-11-13 01:35:00 635

原创 XCode 编译 PAG 源码

最近工作中要使用PAG替换Lottie,为了方便阅读源码,使用XCode对其源码进行了编译。1 下载源码编译源码首先要下载源码,有关PAG源码可直接到github上下载。2 添加相关依赖下载源码之后,进入到PAG项目根目录,执行如下脚本:./sync_deps.sh3 构建 iOS PAGViewer 工程PAG项目包含多种平台下的代码,包括iOS,Windows,Linux等。我...

2024-07-28 15:46:00 441

原创 一文搞懂 ARM 64 系列: 一文搞懂 ARM 64 系列: 函数调用传参与返回值

函数调用涉及到传参与返回值,下面就来看下ARM 64中,参数与返回值的传递机制。1 整数型参数传递这里的整数型并不单指int类型,或者NSInteger类型,而是指任何能够使用整数表示的数据类型,包括char、BOOL、指针等。对于整数型参数,需要分成参数个数<=8个和>8个两种情形来看。如果参数个数 <=8个,那么参数全部使用Xn寄存器传递。比如,一个函数的参数只有...

2024-06-09 04:50:00 1514

原创 一文搞懂 ARM 64 系列: 寄存器

ARM 64中包含多种寄存器,下面介绍一些常见的寄存器。1 通用寄存器ARM 64包含31个64bit寄存器,记为X0~X30。每一个通用寄存器,它的低32bit都可以被访问,记为W0~W30。在这31个通用寄存器中,有2个寄存器比较特殊。X29寄存器被作为栈帧寄存器,也被称为FP(Frame Pointer Register)。X30寄存器被作为函数返回地址寄存器,也被称为LR(...

2024-06-08 21:44:00 2217

原创 一文搞懂 ARM 64 系列: ADCS

1 指令语法adcs <Xd>, <Xn>, <Xm>2 指令语义上面的指令等价于:(Xd, nzcv) = Xn + Xm + PSTATE.C也就是将寄存器Xn,寄存器Xm,进位标志PSTATE.C相加,将结果写入寄存器Xd,同时,这个指令还会影响PSTATE的NZCV标志。ADCS中的S,正式Set的意思,也就是这个指令会Set PSTATE...

2024-05-10 00:33:00 453

原创 一文搞懂 ARM 64 系列: ADC

1 指令语法adc <Xd>, <Xn>, <Xm>2 指令语义adc就是带「进位」加法,指令中的c就是英文carry。整个指令等价于:(Xd, _) = Xn + Xm + PSTATE.C也就是将寄存器Xn,寄存器Xm,PSTATE中的「进位」标志相加,将相加的结果写入寄存器Xd,但是丢弃相加产生的「进位」。也就是说,adc指令只是使用PST...

2024-05-09 02:19:00 575

原创 ARM64: ARDP

1 指令语法ardp <Xd>, <lable>2 指令语义1 获取程序计数器PC寄存器的值;2 将PC寄存器值的低12位全部取0;3 将lable的值乘以4096,也就是将label左移12位;4 将第2步的PC值与第3步的label值相加;5 将第4步所得结果写入寄存器Xd。从上面步骤可以看出,得到的结果低12位为0,所以得到的是一个4KB页大小的首地...

2024-03-24 14:18:00 394

原创 GCD Inside: GCD 数据结构

1 OS_objectOS_object由下面宏OS_OBJECT_DEC_BASE扩展而来:// 1. os/object.hOS_OBJECT_DECL_BASE(object, NSObject);// 2. os/object.h#define OS_OBJECT_DECL_BASE(name, ...) \ @interface OS_OBJECT_CLASS(name...

2023-11-13 03:02:00 229

原创 GCD Inside: GCD 宏

1 __OBJC____OBJC__宏的定义在 GCD 源码中找不到,它定义在 LLVM 的源码中:// initPreprocessor.cppstatic void InitializeStandardPredefinedMacros(const TargetInfo &TI, con...

2023-11-12 00:17:00 179

原创 UIKit Inside: frame bounds position anchorPoint center

iOS 中UIView的属性:frame、bounds、center以及CALayer的属性:position、anchorPoint与视图的位置与大小相关,理解这些属性是进行 iOS 视图编码的基础。下面从汇编角度看一下这些属性的实现以及相互关系。1 frameframe定义了视图在父视图坐标系下的位置与大小。上图中红色UIView的frame为 {x: 50, y: 50, w...

2023-11-06 04:53:00 303

原创 Mach-O Inside: 命令行工具集 otool objdump od 与 dwarfdump

1 otoolotool 命令行工具用来查看 Mach-O 文件的结构。1.1 查看文件头otool -h -v 文件路径-h选项表明查看 Mach-O 文件头。-v 选项表明将展示的内容进行"符号化"处理。上面命令行输出的一个例子如下:magic cputype cpusubtype caps filetype ncmds sizeofcmds flagsM...

2023-10-29 18:55:00 940

原创 Mach-O Inside: BSS Section

1 BSS 起源BSS(Block Started by Symbol)这个词最初是 UA-SAP 汇编器(United Aircraft Symbolic Assembly Program)中的一个伪指令,用于为符号预留一块内存空间。该汇编器由美国联合航空公司于 20 世纪 50 年代中期为 IBM 704 大型机所开发。后来,BSS 这个词被作为关键字引入了 IBM 709 和 7090...

2023-10-29 01:27:00 147

原创 WebKit Insie: Active 样式表

WebKit Inside: CSS 样式表的匹配时机介绍了当 HTML 页面有不同 CSS 样式表引入时,CSS 样式表开始匹配的时机。后续文章继续介绍 CSS 样式表的匹配过程,但是在匹配之前,首先需要收集页面里面的 Active 样式表。1 Active 样式表在一个 HTML 文件里面,可能会使用<style>标签与<link>标签引入许多样式表,但是这些样式...

2023-10-07 21:18:00 304

原创 WebKit Inside: CSS 样式表的匹配时机

WebKit Inside: CSS 的解析 介绍了 CSS 样式表的解析过程,这篇文章继续介绍 CSS 的匹配时机。无外部样式表内部样式表和行内样式表本身就在 HTML 里面,解析 HTML 标签构建 DOM 树时内部样式表和行内样式就会被解析完毕。因此如果 HTML 里面只有内部样式表和行内样式,那么当 DOM 树构建完毕之后,就可以进行样式表的匹配了。假设 HTML 里面的行内样式在...

2023-10-05 17:03:00 250

原创 WebKit Inside: CSS 样式表的解析

CSS 全称为层叠样式表(CascadingStyleSheet),用来定义 HTML 文件最终显示的外观。为了理解 CSS 的加载与解析,需要对 CSS 样式表的组成,尤其是 CSS Selector 有所了解,相关部分可以参看这里。HTML 文件里面引入 CSS 样式表有 3 种方式:1 外部样式表2 内部样式表3 行内样式不同的引入方式,CSS 加载与解析不一样。CSS ...

2023-10-02 23:02:00 239

原创 WebKist Inside: CSS 样式表的组成

1 StyleSheet一张 StyleSheet 由一系列 Rules 组成,这些 Rules 可以分成 2 大类: 1 Style Rule2 At-Rule下面的例子展示了 Style Rule 和 At-Rule:// Style Rulediv { background-color: red; font-size: 12px;}// At-Rule...

2023-10-01 01:02:00 110

原创 WebKit Inside: CSS 样式表解码字符集

CSS 样式表引入有3种方式: 外部样式表、内部样式表、行内样式,不同的引入方式,解码样式表的字符集原理不一样。外部样式表外部样式表由 link 标签引入,当 WebKit 解析到 link 标签时就会构造 CachedCSSStyleSheet 对象。这个对象持有 CachedResourceRequest 对象和 TextResourceDecoder 对象。CachedResource...

2023-09-30 17:13:00 144

原创 C++ 转换构造函数

在 C++ 中如果一个构造函数只有一个参数,那么这个构造函数就是转换构造函数(Converting Constructor),这个构造函数可以将参数类型转换成构造函数所在的类对应的类型。举个例子,假设有如下类 Complex: 1 class Complex { 2 private: 3 int i; 4 int j; 5 6 public: 7 // ...

2023-09-30 15:06:00 267

原创 CSS 样式表引入的3种方式

CSS 全称为层叠样式表(CascadingStyleSheet),用来定义 HTML 文件最终显示的外观。HTML 文件里引入 CSS 样式有3种方式: 外部样式表、内部样式表、行内样式。外部样式表外部样式表通过 link 标签引入:<link rel='stylesheet' type='text/css' href='https://www.test.com/test.c...

2023-09-30 00:32:00 423

原创 一文搞懂 x64 IA-64 AMD64 Inte64 IA-32e 架构之间的关系

想要搞清楚 x64、IA64、AMD64 指令集之间的关系,就要先了解 Intel 和 AMD 这两家公司在生产处理器上的发展历史。x86 处理器1978年 Intel 生产了它的第一款 16bit处理器8086,之后几款处理器名字也都以86结尾,包括80186,80286, 80386,80486,这些处理器的架构被统一称为 x86 架构。其中8086、80186、80286是 16b...

2023-05-03 12:07:00 3338

原创 Linux-0.11操作系统源码调试

学习操作系统有比较好的两种方式,第一种是跟着别人写一个操作系统出来,《操作系统真相还原》、《Orange's:一个操作系统的实现》等书就是教学这个的;另一种方式就是调试操作系统源码,相比第一种方式,调试源码可以更能感受真实操作系统的实现机制。Linux-0.11 是 Linux 最早期的代码,它包含现代操作系统的所有雏形,代码体量也不大,非常适合对操作系统进行源码学习。下面记录在 Ubuntu...

2022-11-12 15:45:00 1170 1

原创 GDB 中内存打印命令

GDB 中使用 "x" 命令来打印内存的值,格式为 "x/nfu addr"。含义为以f格式打印从addr开始的n个长度单元为u的内存值。参数具体含义如下:a)n:输出单元的个数。b)f:是输出格式。比如x是以16进制形式输出,o是以8进制形式输出,等等。c)u:标明一个单元的长度。b是一个byte,h是两个byte(halfword),w是四个byte(wor...

2022-07-31 15:31:00 352

原创 iOS LLVM 中的宏定义

在阅读 Objc 库源码时常常会遇到很多宏定义,比如宏SUPPORT_INDEXED_ISA、SUPPORT_PACKED_ISA,代码如下所示:// Define SUPPORT_INDEXED_ISA=1 on platforms that store the class in the isa // field as an index into a class table.//...

2022-07-30 19:27:00 416

原创 @weakify 与 @strongify 实现原理

为了解决 Block 造成的循环引用,iOS 开发过程中常常使用 @weakify 与 @strongify 来解决这个问题。下面就来看下 @weakify 与 @strongify 的实现原理。准备知识宏参数(Arguments)的扩展可变参数宏宏定义中的重复副作用宏定义里面为什么要加括号?Block对变量的引用@weakify 和 @strongify 的实现原理就是宏展开,阅...

2022-03-20 16:03:00 889

原创 Block对变量的引用

如果在 Block 内部使用外部的变量,Block 会持有这个变量。下面来看几中特殊的情况,看 Block 对变量的持有情况如何。typeof@interface X : NSObject@property (nonatomic, copy) void(^testBlock1)(void);@property (nonatomic, copy) void(^testBlock2)(v...

2022-03-20 00:50:00 125

原创 宏参数(Arguments)的扩展

宏分为两种,一种是 object-like 宏,比如:#define STR "Hello, World!"另一种是 function-like 宏,比如:#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))对于 function-like 宏,定义时的参数叫 Parameters,比如上面宏 MIN 的参数 X、Y,当调用时,传递的参数叫 A...

2022-03-19 16:16:00 132

原创 可变参数宏

定义宏时可以让宏接收可变参数,对于可变参数的定义,标准 C 和 GNU C(GNU 对 C的扩展)是不一样的。标准 C标准 C 对于可变参数的定义如下,使用...:#define eprintf(...) fprintf (stderr, __VA_ARGS__)在宏定义中,__VA_ARGS__ 代表了所有的可变参数。比如像下面使用宏 eprintf:eprintf ("%s:...

2022-03-19 15:13:00 126

原创 宏定义中的重复副作用

副作用(Side Effect)在计算机当中,副作用指当调用一个函数时,这个函数除了返回一个值之外,还对主调函数产生了影响,比如修改了全局变量,修改了参数等等。宏的重复副作用对于求两个数中的最小数,常常可以定义一个宏 MIN,定义如下:#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))上面的宏在写法上完全没有问题。但是假如有下面的代码:i...

2022-03-19 14:47:00 200

原创 宏定义里面为什么要加括号?

在宏定义当中,常常可以看到宏的参数以及整个宏的定义都被小括号包围,就像下面的 MIN、MAX、ABS 宏一样:上面的图截取自 iOS 的系统库,那为什么它们需要这些括号包围起来呢?下面假如我们自定义了宏 ceil_div,代码如下:#define ceil_div(x, y) (x + y - 1) / y这个宏的本意是将 x 除以 y,然后将得到的结果向上取整。比如 x = 4,...

2022-03-19 13:50:00 1312 1

原创 WebKit Inside: DOM树的构建

当客户端App主进程创建WKWebView对象时,会创建另外两个子进程:渲染进程与网络进程。主进程WKWebView发起请求时,先将请求转发给渲染进程,渲染进程再转发给网络进程,网络进程请求服务器。如果请求的是一个网页,网络进程会将服务器的响应数据HTML文件字符流吐给渲染进程。渲染进程拿到HTML文件字符流,首先要进行解析,将HTML文件字符流转换成DOM树,然后在DOM树的基础上,进行渲染操...

2022-02-21 21:25:00 337

原创 WebKit中WTFMove实现

WTFMove定义位置: WTF/Source/wtf/StdLibExtras.h,其定义如下:#define WTFMove(value) std::move<WTF::CheckMoveParameter>(value)从定义可以看出,WTFMove实际上是封装的std::move方法。当使用WTFMove之后,value值会被置为空。...

2022-02-20 18:59:00 140

firebug调试技巧

叫你如何使用firebug调试javascript和jquery,以及如何使用控制台等很多有用技巧

2012-11-12

jsp中EL规范英文文档

EL规范的英文文档,从sun官网上下载,对于查阅EL的语法规则很有帮助

2014-05-18

jsp英文规范

jsp英文规范,从sun官网上下载,对于查阅jsp的实现以及语法很有帮助

2014-05-18

由于axis2的三本英文书籍

三本英文版的有关axis2的书,都自带标签,很清晰,三本书是:Developing WebServices with Apach CXF and Axis2 Developing WebServices with Apache Axis2 Quickstart Apache Axis2-A pratical guide to creating quality web services

2015-09-24

Efficient C++

Efficient C++,深入学习C++的好书,你值得拥有

2015-09-24

Pointers On C Instructors Guide

深入介绍C指针的一本好书,你值得拥有,英文版,很清晰,但是不带标签

2015-09-24

Ajax in Action

介绍Ajax的原理以及经典应用场景,是学习与熟练掌握Ajax的一本好书

2015-09-24

C++ ISO Standard

C++的语法规范标准,如果在开发中遇到C++疑难,这本书是最好的参考资料。英文版,很清晰,自带标签

2015-09-24

C ISO Standard

包括C89和C11两个标准,英文版,都自带标签。C89不是很清晰,C11很清晰。

2015-09-24

C89以及Rational

C89是英文的,带有标签,Rational也是英文的,同样带有标签,如果想检测自己是否懂了C,就来看一下自己是否可以理解C89标准文档(Rational相当于是C89的一个解释文档)

2014-11-26

Anroid4高级编程(第3版)

英文版,带标签,很清晰,本书对android开发进行了很详细的介绍,是进入android开发很好的一部工具书

2015-09-24

css网站设计模板及资源

css网站设计模板,让你能够自己做出漂亮的网页

2012-11-12

加密解密第三版

加密与解密是一本很好的书,书中例子丰富,讲解详细,适合希望熟练运用c的朋友

2012-11-12

elementary functions

两本介绍C中正确编写数学函数的好书,很值得一看,两本书分别是: Software Manual for the Elementary Functions By Cody and Waite Elementary Functions-Algorithms and Implementation

2015-09-24

c语言程序设计中文版

c语言程序设计,让你将c语言完全吃透,并学会编程方法

2012-11-12

div+css布局

dv+css布局,让你熟练掌握css技术,制作出精美漂亮的网页

2012-11-12

Thiking in C++(Vol1 and Vol2)

Thinking in C++两卷(第2版),英文版,很清晰,自带标签,你值得拥有

2015-09-24

提高C++性能的编程技术

详细讲解了提高C++性能的多个方面,涉及临时对象,线程,内联等等方面,是一本绝对有价值的好书。自带标签,很清晰

2015-09-24

The Standard C Library

介绍C标准库的好书,从源代码上让你了解每天都使用的C标准函数内部实现细节。自带标签,但是排版不是很好,因此免费奉送

2015-09-24

Expert C Programming

Expert C Programming,一本让你通向C专家之路的好书,你值得拥有,英文版,很清晰,但是不带标签

2015-09-24

Mac OS X and iOS Internals:To the Apple’s Core.pdf

你可能接触过Windows或者Linux,但是好奇Mac OS X是什么样的。你可能用着苹果手机,希望知道苹果手机系统iOS内部是如何设计的。你可能是iOS开发者,希望进一步提升自己的技术天花板,那么,这本书,就是为你而准备,修炼你的内功,你绝对值得拥有

2020-11-17

Professional Xcode 3

Professional Xcode 3,介绍Xcode的各种配置方法,英文版,绝非样本章节,全本

2016-09-17

Java performance

介绍如何提高java开发中java程序性能的书籍,英文版,很清晰,自带标签

2015-09-24

Ecma-262规范

JavaScript的规范,你可以从中找到JavaScript的运行原理。如果你对JavaScript的机制有疑惑,那么,这里一定可以找到你想知道的答案。你绝对值得拥有

2020-11-17

AdvanceAppleDebugging_v0.9.1_SourceCode

Advance Apple Debuggin and Reversing Engineering源码与pdf

2020-11-17

charles3.11.4 dmg文件以及破解charles.jar

包含charles3.11.4.dmg文件以及charles.jar文件的zip压缩包,你值得拥有

2016-05-26

Unicode Standrad

介绍Unicode标准的书,详细讲解Unicode UTF8 UTF-32 UTF-16 UCS2...的实现和关系。妈妈再也不用担心我的字符编码问题了,英文版,很清晰,自带标签

2015-09-24

Hadoop权威指南

Hadoop权威指南,Hadoop开发中的战斗机,你值得拥有,英文版,自带标签,很清晰

2015-09-24

Java语言规范

Java的语言规范,深入理解Java各个语言细节的必备书籍,英文版,很清晰,自带标签

2015-09-24

IEEE float standard

IEEE754,有关浮点数的规范标准,深入理解浮点数在计算机内部实现原理的最佳书籍,你值得拥有。英文版,很清晰,自带标签

2015-09-24

JVM standard

JVM的规范,英文版,很清晰,自带标签,你值得拥有,绝对是开发当中绝佳的参考书籍

2015-09-24

Git书籍两本打包

两本有关Git使用和实现的书籍,让你轻松学会使用Git,这两本书分别是:Pro Git Version Control with Git,都是英文版的,很清晰,并且自带标签

2015-09-24

JSP standard

JSP语言规范,英文版,自带标签,很清晰

2015-09-24

EL语言规范

Sun的有关EL语言的规范,方便你查询,觉对值得拥有。

2015-09-24

链接器和加载器

包括中文版和英文版,让你彻底了解整个程序的构建过程,Everything Under Control

2015-09-24

GDB使用文档

有关GDB调试工具的文档,英文版,自带标签,很清晰

2015-09-24

HBase The Definitive Guide

有关HBase介绍的书,英文版,很清晰,但是没有标签

2015-09-24

Java IO合集

包含Java IO和NIO介绍的两本书,分别是:Java IO Java NIO,都是英文版,很清晰,自带标签

2015-09-24

Java RMI开发

介绍Java RMI的书籍,英文版,很清晰,但是没有标签

2015-09-24

Servlet规范

Sun的Servlet规范文档,学习Servlet必不可少的书籍。英文版,很清晰,自带标签

2015-09-24

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除