神探侯佩系列之智破量子矩陣

在任何一部編程懸疑動作片裏,每一個超級英雄都有一個頹廢的開始…

本故事純屬虛構
如有雷同洗洗睡吧

警告:未經允許禁止轉載!!!

楔子

在這裏插入圖片描述

未知星球。

雨還在下,漆黑的烏雲壓抑的想吐。

極度的黑暗中,一枚紅點忽明忽暗…

一團黑影斜靠着牆壁,使勁的吐着菸圈…

牆壁上到處都留存着納米激光射線刻着的"S w i f t",“S w i f t U I”,“C o m b i n e”,"i O S"等殘破烙印,彷彿還在宣告183年前那場世紀大戰有多麼慘烈…

“臥底雨燕黨已經211天了,還是沒能查出到底他們是怎麼把量子矩陣傳遞出去的,這樣的話會來不及的…”

與此同時,在地球…

在這裏插入圖片描述

“這麼說,你們只是搞清楚了它有兩個特性,其它的毛線都不知道?”,局長悻悻的說。

“是的,量子矩陣(以下簡稱量矩)能根據空間自動調節自己的尺寸,它具有抗壓和抗拉兩個特性,但是,局長…”

大屏幕上適時的打出以下兩行大字:

  • 抗拉 Content Hugging Priority
  • 抗壓 Content Compression Resistance Priority

“但是你們就是不知道它們是怎麼被修改的???!!!”,局長有點壓不住火了。

“知…知道,通過setContentHuggingPriority:forAxis:和setContentCompressionResistancePriority:forAxis:兩條夸克隧道,可是再往下就不知道了…”,行動處長戰戰兢兢的說。

“爲什麼該死的燕子黨突然會調整量矩?我們的人泄露了消息???”

“是…是的…查找內奸的行動已經祕密展開了…”

“那麼現在我們只能把寶押在侯探員身上了?”

“恐怕如此…”

“最好是這樣,否則你們下半輩子都會爛在黑洞阿爾法裏…”

“阿爾法…還阿凡達呢,你妹的…”,處長臉上保持惶恐,可心裏也是有點小脾氣的。

在這裏插入圖片描述

“侯佩,侯探員…你TM到底在哪啊?”,局長眼瞼不動聲色地抽動了一下,轉過身去,透過巨大的飄窗直視着遠方聳入雲端的徽塔,但卻又好像什麼都沒看到…

星際墳場

1億8千萬光年之外…

遙遠的蘋果星雲中心,看似空空如也。

在這裏插入圖片描述

其實並不是!

如果能展開空間的第13維度,你會發現一顆渺小的中子星隱藏在其中,外形像極了一顆咬了一口的蘋果。它就是臭名昭著的雨燕黨老巢—星際墳場。

100萬年前就是這名不見經傳的小小雨燕黨,在這裏摧毀了紅極一時的歐碧姐C黨派,迅速崛起,稱霸一方,留下一片上古文明的殘骸焦土。

星際墳場B2區地下的堡壘中,斜躺着一位身材碩大的黨魁,一張黢黑的老臉很是享受。在他懷裏坐着一個身材嬌小的紅髮妓女,不時發出咯咯嬌笑。

牆上全息光子電視中用最大音量播放着最新出的愛情動作片《東京還是熱》…

“你就給我看一下那個盒子嘛,蟑螂大爺…”,女子按着黨魁的鼻子說,一臉放蕩。

"別胡鬧!"站在旁邊一個佝僂着的小混混連忙上前伸手喝止着。

“死侏儒,你敢碰我…”,女子微嗔道。

小混混站在那裏不敢動了,低下頭微微斜眼揣測着BOSS的意圖。

“沒事,沒事,不過這個可不太行哦…”,長得像蟑螂的黨魁陰陽怪氣的說。

話音未落,"老蟑螂"突然眉頭一皺,雙眼一翻,身子像一灘爛泥般癱軟下去…

小混混急忙推開紅髮女子,扶起"老蟑螂",只見他的鼻子外側有一個暗紅色的小洞,向外汩汩淌着血水。

“你…你幹了什麼!?”,越害怕小混混的臉顯得越醜陋。

“別亂動,否則你也一樣下場…”,只見紅髮妓女掏出一隻電擊約束環,麻利的套在小侏儒手上,小侏儒瞬間失去了反抗能力。

紅髮女子似乎很滿意小侏儒錯愕的表情,從左胸的暗兜中掏出一根吸取器,對着"老蟑螂"的左眼猛地紮了下去…

在這裏插入圖片描述

“你瘋了…”,小混混直冒冷汗,使勁的將鼻涕吸了回去,心想:“這女人長的挺好看,心怎麼這般狠毒呢???”

只聽嗖的一聲,眼球應聲而起,奇怪的是沒有流半滴血,原來是一隻假眼。

紅髮女子輕輕捏碎假眼球,從裏面捏出一隻微型手電筒狀的東東,按下開關,射出一道紫紅色的光束。

女子擼起左臂,露出白皙的胳膊,上面紋有幾個小字, 紅光輕輕掃過小字,只聽滴滴滴三聲,紫紅色的光束逐漸變大,成爲一個人型大小的光圈。

小侏儒頓時嚇得尿了出來,黃濁的尿液順着褲腿流到地上…, 因爲他看清了那幾個紋着的小字:

Objective-C Forever!!!

嘆息之牆

在這裏插入圖片描述

紅髮女子表情瞬間變得異常莊嚴神聖,只見她緩緩摘掉紅色的長假髮,露出一頭黑色的短髮,渾身白皙的皮膚在紫色的光圈掩映下,微微泛紅。

“你…你是歐碧姐C黨的後人…”,小侏儒貌似有點驚慌。

“閉嘴…你不配說我們黨的名字…”,不待說完,C黨美女矮身就要進入光圈…

“不…等等…你不能進去…會送命的…”

“什麼?”

“你沒法突破嘆息之牆,會被撕碎的…除非…”

“除非什麼…”

“除非你有System V ABI接口的鑰匙…”

“哈哈,你以爲我不知道麼…你幹嘛這麼關心我?”

“因爲…因爲你長得好看…”

C黨美女嫣然一笑,隨即正色道:“你這侏儒,懂個屁!”

正說着,她隨手從右胸的暗兜裏掏出一個納米投影儀,打開開關將畫面投射到牆上:

The calling convention of the System V AMD64 ABI is followed on Solaris, Linux, FreeBSD, Mac OS X, and other UNIX-like or POSIX-compliant operating systems. The first six integer or pointer arguments are passed in registers RDI, RSI, RDX, RCX, R8, and R9, while XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6 and XMM7 are used for floating point arguments. For system calls, R10 is used instead of RCX. As in the Microsoft x64 calling convention, additional arguments are passed on the stack and the return value is stored in RAX.

小侏儒本想問:“你是機器貓麼?胸裏面哪來這麼多兜兜呢?”,但還是抿抿嘴忍住了…

在這裏插入圖片描述

“你懂這種語言嗎?”,美女問道。

“不太懂…”

“這叫英語,英格利希”

“嗯…以前好像聽BOSS說過,不是幾千萬年前就失傳了麼?”

“哼,自從上古時期一個叫瓷器的帝國統治全宇宙之後,瓷器語就成爲全宇宙唯一的官方語言了,我們現在用的都是瓷器語的衍生語。不過那時候有些文字是用英語寫的…”

在這裏插入圖片描述

“你怎麼會知道這些,你到底是誰啊…”

美女沒有理睬他,跳入光圈,口中唸唸有詞: “XCode,XCode,急急如律令…setContentCompressionResistancePriority:forAxis:,斷!”

投影儀文字瞬間定格在如下畫面:

在這裏插入圖片描述

“比想象的難,矩陣接口內部果然用了跳轉,那就是…”

美女自言自語的說:

“objc_msgSend…”

歐碧姐·米思婕莎德

在這裏插入圖片描述

“不過有了ABI鑰匙,還是可以解讀的…”

美女心裏默默演算起來…

“矩陣內部幾乎所有隧道都會被objc_msgSend包裝,所以setContentCompressionResistancePriority實際調用形式是…”

objc_msgSend(self,SEL,priority,axis)

“再根據ABI接口規範,那麼就可以得到各個輸入參數的值了…”

self: rdi 0x00007ff428512da0

SEL: rsi 0x00007fff52751fe3

priority: xmm0 40 E0 00 00

axis: rdx 1

美女已不顧目瞪口呆的小混混,口中繼續念着:“XCode,繼續,再斷!”

投影儀畫面立即變換爲如下內容:

libobjc.A.dylib`objc_msgSend:
->  0x7fff513f7780 <+0>:   testq  %rdi, %rdi
    0x7fff513f7783 <+3>:   jle    0x7fff513f77e8            ; <+104>
    0x7fff513f7785 <+5>:   movq   (%rdi), %r10
    0x7fff513f7788 <+8>:   movq   %rsi, %r11
    0x7fff513f778b <+11>:  andl   0x18(%r10), %r11d
    0x7fff513f778f <+15>:  shlq   $0x4, %r11
    0x7fff513f7793 <+19>:  addq   0x10(%r10), %r11
    0x7fff513f7797 <+23>:  cmpq   (%r11), %rsi
    0x7fff513f779a <+26>:  jne    0x7fff513f77a6            ; <+38>
    0x7fff513f779c <+28>:  movq   0x8(%r11), %r11
    0x7fff513f77a0 <+32>:  xorq   %r10, %r11
    0x7fff513f77a3 <+35>:  jmpq   *%r11
    0x7fff513f77a6 <+38>:  cmpq   $0x1, (%r11)
    0x7fff513f77aa <+42>:  jbe    0x7fff513f77bf            ; <+63>
    0x7fff513f77ac <+44>:  addq   $0x10, %r11
    0x7fff513f77b0 <+48>:  cmpq   (%r11), %rsi
    0x7fff513f77b3 <+51>:  jne    0x7fff513f77a6            ; <+38>
    0x7fff513f77b5 <+53>:  movq   0x8(%r11), %r11
    0x7fff513f77b9 <+57>:  xorq   %r10, %r11
    0x7fff513f77bc <+60>:  jmpq   *%r11
    0x7fff513f77bf <+63>:  jb     0x7fff513f7831            ; <+177>
    0x7fff513f77c1 <+65>:  movq   0x8(%r11), %r11
    0x7fff513f77c5 <+69>:  jmp    0x7fff513f77d1            ; <+81>
    0x7fff513f77c7 <+71>:  cmpq   $0x1, (%r11)
    0x7fff513f77cb <+75>:  jbe    0x7fff513f77e0            ; <+96>
    0x7fff513f77cd <+77>:  addq   $0x10, %r11
    0x7fff513f77d1 <+81>:  cmpq   (%r11), %rsi
    0x7fff513f77d4 <+84>:  jne    0x7fff513f77c7            ; <+71>
    0x7fff513f77d6 <+86>:  movq   0x8(%r11), %r11
    0x7fff513f77da <+90>:  xorq   %r10, %r11
    0x7fff513f77dd <+93>:  jmpq   *%r11
    0x7fff513f77e0 <+96>:  jmp    0x7fff513f7831            ; <+177>

投影儀畫面底部出現一段若隱若現的小字:

深入解構objc_msgSend函數的實現
https://www.jianshu.com/p/df6629ec9a25

“嗯,隧道內部果然是用上古時期的ASM語言描繪的,這應該是at&a而不是intel語種”,美女微微仰首伸眉。

“沒錯,第一行指令是比較rdi中的self地址是否爲nil,是的話就直接跳到隧道末尾結束…這個testq用的好,像and卻不會改變rdi裏的值,只會置位Flag寄存器,比cmp 0,%rdi快多了…”

"但是接下來這些指令又是做什麼的呢?"美女頭皮略微發麻,後面一大串指令似乎超出她的分析能力,該從哪入手呢???

忽然,她意識到objc_msgSend會尋找self對象的isa表,然後再從方法地址緩存中尋找SEL對應的方法…不管怎樣一定是間接跳轉!!!

投影儀彷彿有自己的想法,偷偷在畫面底部加上一小段話:

一個objc對象的isa的指針指向什麼?有什麼作用?
https://www.jianshu.com/p/05fecee74e97

美女並沒有注意到這一點,只是將目光鎖定在其中3個相同的語句上:

jmpq *%r11

“就是它們了…3個全部下斷!繼續…”,隨着美女口中唸唸有詞,屏幕繼續變換着…

很快傳送進入第1個jmpq,接着退出,最後停在了下面:

在這裏插入圖片描述

“怎麼又是古老的ASM語言…不是很懂啊…不管了,再繼續吧…”

很快投影儀顯示了一行行很有規律的內容:

在這裏插入圖片描述

“是了,這就是跳轉表了…再進去看看…”

在這裏插入圖片描述

“原來setContentCompressionResistancePriority會在隧道內部首先調用_contentCompressionResistancePriorities(),大致意思能看懂…它會判斷是否有primitive值,如果有則返回,如果沒有則返回default值…”

“那麼,分別在_primitiveContentCompressionResistancePrioritiesValue()和_defaultContentCompressionResistancePriorities()下斷,然後繼續!”

投影儀機械的執行着美女的指令:

在這裏插入圖片描述
在這裏插入圖片描述

“啊哈…找到了…原來最終是調用objc_getAssociateObject來取得primitive值的啊…這個叫關聯對象吧?”

“等等,如果我知道了關聯對象的Key,我就可以繞過setContentCompressionResistancePriority直接寫量子矩陣的屬性了,同理對讀操作也是一樣。”

“那麼就來克隆這個Key吧!回到第5張圖,跳轉到UIViewToContentCompressionResistancePrioritiesAssociatedStorageKey對應的內存!”

在這裏插入圖片描述

在這裏插入圖片描述

“怎麼指向的內容都是0??? 哦…它只是一個const void * _Nonnull的指針而已,只要指針非空即可,至於裏面的內容,那隨便吧…”

這時小侏儒突然來了一句:“你到底是什麼人?”

“我!? 哼…”,沉醉在演算的快感中的美女下意識的回答着:“我就是歐碧姐·米思婕莎德(後面簡稱米妹),歐碧姐C黨的公主陛下…”

抽絲剝繭

在這裏插入圖片描述

周圍的光線逐漸暗淡下來,從紫色的光圈中浮現出一個墨黑色的盒子,發出淡黃色的光芒…

盒子六面都浮現出同一個黑白相間的奇怪圖案…

在這裏插入圖片描述

“如果有手機可以掃一下…”,米妹喃喃的說…

“什麼意思?”,小侏儒丈二和尚摸不着頭腦…

“不是說給你聽的…”

“what???”

“哎,別管了…其實這個盒子就是量子矩陣…”

小侏儒驚了… “怎麼在這?”

“我也不知道,這是蘋果星雲的創始者喬神留下來的遠古遺骸之一,爲了紀念他的女兒Lisa…”

米妹用纖細的手指輕輕觸碰矩陣的邊角,但是什麼都沒有發生…

“咦?怎麼不行?”,米妹有點慌了……

投影儀顯示的內容逐漸有了變化:

UIKitCore`-[UIView(UIConstraintBasedLayout) setContentCompressionResistancePriority:forAxis:]:
    0x7fff4902e765 <+0>:   pushq  %rbp
    0x7fff4902e766 <+1>:   movq   %rsp, %rbp
    0x7fff4902e769 <+4>:   pushq  %r14
    0x7fff4902e76b <+6>:   pushq  %rbx
    0x7fff4902e76c <+7>:   subq   $0x10, %rsp
    0x7fff4902e770 <+11>:  movq   %rdx, %rbx
    0x7fff4902e773 <+14>:  movss  %xmm0, -0x14(%rbp)
    0x7fff4902e778 <+19>:  movq   %rdi, %r14
    0x7fff4902e77b <+22>:  movq   0x40732ed6(%rip), %rsi    ; "_contentCompressionResistancePriorities"
    0x7fff4902e782 <+29>:  callq  *0x3d850740(%rip)         ; (void *)0x00007fff50b37400: objc_msgSend
->  0x7fff4902e788 <+35>:  movaps %xmm1, %xmm2
    0x7fff4902e78b <+38>:  cvtss2sd -0x14(%rbp), %xmm1
    0x7fff4902e790 <+43>:  testq  %rbx, %rbx
    0x7fff4902e793 <+46>:  je     0x7fff4902e7a9            ; <+68>
    0x7fff4902e795 <+48>:  ucomisd %xmm1, %xmm2
    0x7fff4902e799 <+52>:  jne    0x7fff4902e79d            ; <+56>
    0x7fff4902e79b <+54>:  jnp    0x7fff4902e7cf            ; <+106>
    0x7fff4902e79d <+56>:  movq   0x40732ebc(%rip), %rsi    ; "_setContentCompressionResistancePriorities:"
    0x7fff4902e7a4 <+63>:  movq   %r14, %rdi
    0x7fff4902e7a7 <+66>:  jmp    0x7fff4902e7c1            ; <+92>
    0x7fff4902e7a9 <+68>:  ucomisd %xmm1, %xmm0
    0x7fff4902e7ad <+72>:  jne    0x7fff4902e7b1            ; <+76>
    0x7fff4902e7af <+74>:  jnp    0x7fff4902e7cf            ; <+106>
    0x7fff4902e7b1 <+76>:  movq   0x40732ea8(%rip), %rsi    ; "_setContentCompressionResistancePriorities:"
    0x7fff4902e7b8 <+83>:  movq   %r14, %rdi
    0x7fff4902e7bb <+86>:  movaps %xmm1, %xmm0
    0x7fff4902e7be <+89>:  movaps %xmm2, %xmm1
    0x7fff4902e7c1 <+92>:  addq   $0x10, %rsp
    0x7fff4902e7c5 <+96>:  popq   %rbx
    0x7fff4902e7c6 <+97>:  popq   %r14
    0x7fff4902e7c8 <+99>:  popq   %rbp
    0x7fff4902e7c9 <+100>: jmpq   *0x3d8506f9(%rip)         ; (void *)0x00007fff50b37400: objc_msgSend
    0x7fff4902e7cf <+106>: addq   $0x10, %rsp
    0x7fff4902e7d3 <+110>: popq   %rbx
    0x7fff4902e7d4 <+111>: popq   %r14
    0x7fff4902e7d6 <+113>: popq   %rbp
    0x7fff4902e7d7 <+114>: retq

其中2列特別亮:

cvtss2sd -0x14(%rbp), %xmm1

ucomisd %xmm1, %xmm0

“這是setContentCompressionResistancePriority:forAxis:隧道的完整ASM表述,不過上面兩行是什麼意思?”,米妹又準備開始大腦驗算…

“第一行很簡單,就是 Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value,用今天的話來說就是擴展單精度浮點到雙精度浮點…”,這時一個冷冷的聲音說着。

“後面一句要跟它後面的兩句連起來看.”,那個聲音繼續緩緩的說:

0x7fff4902e7a9 <+68>:  ucomisd %xmm1, %xmm0
0x7fff4902e7ad <+72>:  jne    0x7fff4902e7b1            ; <+76>
0x7fff4902e7af <+74>:  jnp    0x7fff4902e7cf            ; <+106>

“ucomisd指令用英格利希來說就是:Unordered Compare Scalar Double-Precision Floating-Point Values and Set EFLAGS。意思是無序雙精度浮點數的比較,且比較的結果會置位標誌寄存器的位。”

“哦!?是這樣麼?怎麼個比較法呢?”,米妹很自然的繼續問。

“這個…看一下指令集中Opertaion的描述:”

RESULT← UnorderedCompare(DEST[63:0] <> SRC[63:0]) {
(* Set EFLAGS *) CASE (RESULT) OF
    UNORDERED: ZF,PF,CF←111;
    GREATER_THAN: ZF,PF,CF←000;
    LESS_THAN: ZF,PF,CF←001;
    EQUAL: ZF,PF,CF←100;
ESAC;
OF, AF, SF←0; }

“上面2條指令首先jne判斷Z標誌是否不爲0,若不爲0則有兩種可能:”

  1. UNORDERED: 比較的浮點數是無序的
  2. 或者它們是相等的

投影儀畫面底部又浮現出一行小字:

What does ordered / unordered comparison mean?
https://stackoverflow.com/questions/8627331/what-does-ordered-unordered-comparison-mean

“至於究竟是哪種情況就要看後面那條jnp指令,它用來判斷P位是否爲0,若爲0,那麼只有一種可能:這兩個數是相等的。所以這裏來說ucomisd就是用來比較新設置的priority是否與之前設置的值相同,如果相同則沒必要再設置了,也算一種優化吧…”

“哦…原來是這樣…咦…你怎麼知道!?”

小侏儒沉默…

“你剛纔聽到我是公主陛下怎麼不吃驚???”,米妹彷彿有點看不懂這個小混混了,“你沒聽到我說話麼,你聾啦,小侏儒!”

“其實我不是侏儒…”

“你說什麼?”

“其實我是大熊貓…”

神探大熊貓侯佩

在這裏插入圖片描述

話音剛落,小侏儒雙手箍着的電擊約束環鐺的一聲掉到地上,只見他的身子舒展開,像充了氣似的,瘦小的身子漸漸變得高大魁梧。他伸手慢慢將臉上的一層皮揭掉,原來猥瑣醜陋的面容頓時變得異常英俊…

在這裏插入圖片描述

“原來你長的這般俊…”,米妹臉有點微微發燙…

“我知道,不是你一個人這樣說…”

“我想給你生兒子…”

“搖號去…”

跑偏了,咱再倒回去重新說…


“你到底是誰?!”,米妹睜大了眼睛

“我是侯佩,我來自地球…”

“地球?難道你是臥底?”

“沒錯,我是臥底,代號大熊貓9527”

“我有點不信,剛纔你都尿了…”

“我尿點比較低…”

“…”

“知道你爲什麼打不開量子矩陣麼?”

“不知道,我明明已經解開祕鑰了啊?!”,米妹有些沮喪…

“你必須更明確的告訴量子矩陣你的意圖,而不是籠統說ASM語言層面上的東西,比如要告訴量矩用類C語言來還原setContentCompressionResistancePriority:forAxis:()隧道的話,是這個樣子的:”

void setContentCompressionResistancePriority(priority:float, axis:Int){
	CGSize old_priority_size = _contentCompressionResistancePriorities()

	if axis == UILayoutConstraintAxisHorizontal{
		if float(old_priorities_size.x) != priority{
			NSValue *new_priorities = NSValue(valueWithCGSize:CGSizeMake(priority, old_priority_size.y));
			_setContentCompressionResistancePriorities(new_priorities)
		}
	}else{
		if float(old_priorities_size.y) != priority{
			NSValue *new_priorities = NSValue(valueWithCGSize:CGSizeMake(old_priority_size.x, priority));
			_setContentCompressionResistancePriorities(new_priorities)
		}
	}
}

“同理,我們可以還原_contentCompressionResistancePriorities():”

CGSize _contentCompressionResistancePriorities(){
	NSValue *priority_value = _primitiveContentCompressionResistancePrioritiesValue()

	if priority_value != nil{
		return priority_value.sizeValue
	}else{
		return _defaultContentCompressionResistancePriorities()
	}
}

“你…”,米妹做夢也沒有想到過還要這樣還原…

“最後是兩個小隧道的還原:”

CGSize _defaultContentCompressionResistancePriorities(){
	return CGSizeMake(750.0 , 750.0)
}

NSValue* _primitiveContentCompressionResistancePrioritiesValue(){
	return objc_getAssociatedObject(key: (const void * _Nonnull)UIViewToContentCompressionResistancePrioritiesAssociatedStorageKey)
}

說完這些,矩陣盒子突然發出極其明亮的光,開始有規律的抖動起來…

“可以了…隧道已經開啓了…”

“要坍塌了…不能待在這裏了…”,侯佩目光如聚的盯着米妹,對方也含情脈脈的盯着侯佩…

“走吧…”,兩人異口同聲的說。

逃離

在這裏插入圖片描述

正當兩人準備踏入光圈,量子矩陣突然開始劇烈搖晃起來,原來的隧道接口被無恥的關閉了。

“不好,接口被人關閉了, 我們回不去了…”,米妹急的差點掉出了眼淚。

“一定是Swift Runtime黑暗傀儡師乾的!!! 不過沒事,經過上面的演算,我們已經可以跳過Runtime系統隧道接口,隨意修改矩陣空間了,別急,看我的…”

只見,侯佩不慌不忙的從袖子掏出一隻激光筆,很快鍵入了以下內容:

#define UIViewToContentCompressionResistancePrioritiesAssociatedStorageKey 0x00007fff8992c082

id priority = objc_getAssociatedObject(v1, (const void * _Nonnull) UIViewToContentCompressionResistancePrioritiesAssociatedStorageKey);
    
NSValue *v = [NSValue valueWithCGSize:CGSizeMake(77, 121)];

objc_setAssociatedObject(v1, (const void * _Nonnull) UIViewToContentCompressionResistancePrioritiesAssociatedStorageKey, v, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

“太棒了,(77,121)量子位移正好可以容納我們兩個,走吧…”

“我不能和你走,我還有任務…”

“你…”,眼淚已經自米妹的大眼眶裏晃來晃去了…

“有緣再見吧,我的公主…”,說完這句話,侯佩頭也不回的離開了地堡…

留下米妹公主癡癡地望着他的背影,好像還想說什麼,但最終沒有說出口…

“再見了,我的大熊貓…”,公主心裏默默唸着,緩緩走進了矩陣光圈…

一聲巨響,量子矩陣收縮的無影無蹤…

一切好像從未發生過…

尾聲

在這裏插入圖片描述

與此同時,地球.

滴滴滴…行動處長手腕上高級量子VPN聯絡器響了起來…

“嗯…都搞定了!?好的,知道了…”,掛掉聯絡器,處長長舒了一口氣。

“好!乾的不錯…”,局長聽了彙報後終於欣慰的笑了…

“那沒什麼事,我回去安排侯探員的下一步行動了…”

“嗯,去吧,辛苦了…”

處長轉過身,快步走了出去…他不知道的是,背後局長臉上的笑容逐漸變得猙獰起來…

“這次傀儡術沒有把你們幹掉,下次你們不會這麼幸運了…”,局長獰笑着,瞳孔浮現出一隻血紅的雨燕…

在這裏插入圖片描述

代碼調試: 大熊貓侯佩
原創劇情: 大熊貓侯佩
文章撰寫: 大熊貓侯佩
後期潤色: 大熊貓侯佩
圖片篩選: 大熊貓侯佩

(本集完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章