得物H5容器野指針疑難問題排查 & 解決
得物 iOS 4.9.x 版本 上線后,一些帶有橫向滾動內(nèi)容的h5頁面,有一個webkit 相關(guān)crash增加較快。通過Crash堆棧判斷是UIScrollview執(zhí)行滾動動畫過程中內(nèi)存野指針導(dǎo)致的崩潰。
2、前期排查通過頁面瀏覽日志,發(fā)現(xiàn)發(fā)生崩潰時所在的頁面都是在h5 web容器內(nèi),且都是在頁面的生命周期方法viewDidDisappear方法調(diào)用后才發(fā)生崩潰,因此推測崩潰是在h5 頁面返回時發(fā)生的。
【資料圖】
剛好交易的同事復(fù)現(xiàn)了崩潰證實了我們的推測。因此可以基本確定:崩潰的原因是頁面退出后,頁面內(nèi)存被釋放,但是滾動動畫繼續(xù)執(zhí)行,這時崩潰堆棧中scrollview的delegate沒有置空,系統(tǒng)繼續(xù)執(zhí)行delegate的相關(guān)方法,訪問了已經(jīng)釋放的對象的內(nèi)存(野指針問題)。
同時發(fā)生crash h5 頁面都存在一個特點,就是頁面內(nèi)存在可以左右橫滑的tab視圖。
操作手勢側(cè)滑存在體驗問題,左右橫滑的tab視圖也會跟著滾動(見下面視頻)。關(guān)聯(lián)bugly用戶行為日志,判斷這個體驗問題是和本文中的crash有相關(guān)性的。
3、不完美的解決方案經(jīng)過上面的分析,修復(fù)思路是在h5頁面手勢側(cè)滑返回時,將h5容器頁面內(nèi)tab的橫滑手勢禁掉(同時需要在 h5 web容器的viewWillAppear方法里將手勢再打開,因為手勢側(cè)滑是可以取消在返回頁面)。
具體代碼如下(這樣在操作頁面?zhèn)然祷貢r,頁面的手勢被禁掉,不會再滾動):
@objc dynamic func webViewCanScroll(enable:Bool) { let contentView = self.webView.scrollView.subviews.first { view in if let className = object_getClass(view), NSStringFromClass(className) == "WKContentView" { return true } return false } let webTouchEventsGestureRecognizer = contentView?.gestureRecognizers?.first(where: { gesture in if let className = object_getClass(gesture), NSStringFromClass(className) == "UIWebTouchEventsGestureRecognizer" { return true } return false }) webTouchEventsGestureRecognizer?.isEnabled = enable }@objc dynamic func webViewCanScroll(enable:Bool) { let contentView = self.webView.scrollView.subviews.first { view in if let className = object_getClass(view), NSStringFromClass(className) == "WKContentView" { return true } return false } let webTouchEventsGestureRecognizer = contentView?.gestureRecognizers?.first(where: { gesture in if let className = object_getClass(gesture), NSStringFromClass(className) == "UIWebTouchEventsGestureRecognizer" { return true } return false }) webTouchEventsGestureRecognizer?.isEnabled = enable }
經(jīng)過測試,h5 web容器側(cè)滑時出現(xiàn)的tab頁面左右滾動的體驗問題確實被解決。這樣既可以解決體驗問題,又可以解決側(cè)滑離開頁面導(dǎo)致的崩潰問題,但是這樣并沒有定位crash的根因。修復(fù)代碼上線后,crash量確實下降,但是每天還是有一些crash出現(xiàn),且收到了個別頁面極端操作下偶現(xiàn)卡住的問題反饋。因此需要繼續(xù)排查crash根因,將crash根本解決掉。
繼續(xù)看文章開始的crash堆棧,通過Crash堆棧判斷崩潰原因是UIScrollview執(zhí)行滾動動畫過程中回調(diào)代理方法(見上圖)時訪問被釋放的內(nèi)存。常規(guī)解決思路是在退出頁面后,在頁面生命周期的dealloc方法中,將UIScrollview的delegate置空即可。WKWebView確實有一個scrollVIew屬性,我們在很早的版本就將其delegate屬性置空,但是崩潰沒有解決。
deinit { scrollView.delegate = nil scrollView.dataSource = nil }deinit { scrollView.delegate = nil scrollView.dataSource = nil }
因此崩潰堆棧里的Scrollview代理不是這里的WKWebView的scrollVIew的代理。那崩潰堆棧中的scrollView代理到底屬于哪個UIScrollview呢?幸運(yùn)的是蘋果webkit 是開源的,我們可以將webkit源碼下載下來看一下。
4、尋找崩潰堆棧中的ScrollViewDelegate崩潰堆棧中的ScrollViewDelegate是WKScrollingNodeScrollViewDelegate。首先看看WKWebView的scrollview的 delegate是如何實現(xiàn)的,因為我們猜想這個scrollview的delegate除了我們自己設(shè)置的,是否還有其他delegate(比如崩潰堆棧中的WKScrollingNodeScrollViewDelegate)。
通過對Webkit源碼一番研究,發(fā)現(xiàn)scrollview的初始化方法:
- (void)_setupScrollAndContentViews{ CGRect bounds = self.bounds; _scrollView = adoptNS([[WKScrollView alloc] initWithFrame:bounds]); [_scrollView setInternalDelegate:self]; [_scrollView setBouncesZoom:YES];}- (void)_setupScrollAndContentViews{ CGRect bounds = self.bounds; _scrollView = adoptNS([[WKScrollView alloc] initWithFrame:bounds]); [_scrollView setInternalDelegate:self]; [_scrollView setBouncesZoom:YES];}
WKWebView的scrollVIew 是WKScrollView 類型。
4.1 WKScrollView 代理實現(xiàn)首先看到WKWebView的scrollview的類型其實是WKScrollView(UIScrollview的子類),他除了繼承自父類的delegate屬性,還有一個internalDelegate屬性,那么這個internalDelegate屬性是不是我們要找的WKScrollingNodeScrollViewDelegate 呢?
@interface WKScrollView : UIScrollView@property (nonatomic, assign) WKWebView *internalDelegate;@end@interface WKScrollView : UIScrollView@property (nonatomic, assign) WKWebView *internalDelegate;@end
通過閱讀源碼后發(fā)現(xiàn)不是這樣的(代碼有刪減,感興趣可自行閱讀源碼)。
- (void)setInternalDelegate:(WKWebView *)internalDelegate{ if (internalDelegate == _internalDelegate) return; _internalDelegate = internalDelegate; [self _updateDelegate];}- (void)setDelegate:(id )delegate{ if (_externalDelegate.get().get() == delegate) return; _externalDelegate = delegate; [self _updateDelegate];}- (id )delegate{ return _externalDelegate.getAutoreleased();}- (void)_updateDelegate{//...... if (!externalDelegate) else if (!_internalDelegate) else { _delegateForwarder = adoptNS([[WKScrollViewDelegateForwarder alloc] initWithInternalDelegate:_internalDelegate externalDelegate:externalDelegate.get()]); [super setDelegate:_delegateForwarder.get()]; }}- (void)setInternalDelegate:(WKWebView *)internalDelegate{ if (internalDelegate == _internalDelegate) return; _internalDelegate = internalDelegate; [self _updateDelegate];}- (void)setDelegate:(id )delegate{ if (_externalDelegate.get().get() == delegate) return; _externalDelegate = delegate; [self _updateDelegate];}- (id )delegate{ return _externalDelegate.getAutoreleased();}- (void)_updateDelegate{//...... if (!externalDelegate) else if (!_internalDelegate) else { _delegateForwarder = adoptNS([[WKScrollViewDelegateForwarder alloc] initWithInternalDelegate:_internalDelegate externalDelegate:externalDelegate.get()]); [super setDelegate:_delegateForwarder.get()]; }}
這個internalDelegate的作用是讓W(xué)KWebView 監(jiān)聽scrollview的滾動回調(diào),同時也可以讓開發(fā)者在外部監(jiān)聽WKWebView的scrollview回調(diào)。如何實現(xiàn)的呢?可以查看WKScrollViewDelegateForwarder的實現(xiàn)。
- (void)forwardInvocation:(NSInvocation *)anInvocation{ //... if (internalDelegateWillRespond) [anInvocation invokeWithTarget:_internalDelegate]; if (externalDelegateWillRespond) [anInvocation invokeWithTarget:externalDelegate.get()];}- (void)forwardInvocation:(NSInvocation *)anInvocation{ //... if (internalDelegateWillRespond) [anInvocation invokeWithTarget:_internalDelegate]; if (externalDelegateWillRespond) [anInvocation invokeWithTarget:externalDelegate.get()];}
通過復(fù)寫- (void)forwardInvocation:(NSInvocation *)anInvocation 方法,在消息轉(zhuǎn)發(fā)時實現(xiàn)的。
4.2 猜想 & 驗證既然WKScrollingNodeScrollViewDelegate 不是WKScrollview的屬性,那說明崩潰堆棧中的scrollview不是WKScrollview,那頁面上還有其他scrollview么。我們看源碼WKScrollingNodeScrollViewDelegate 是在哪里設(shè)置的。
void ScrollingTreeScrollingNodeDelegateIOS::commitStateAfterChildren(const ScrollingStateScrollingNode& scrollingStateNode){ //...... if (scrollingStateNode.hasChangedProperty(ScrollingStateNode::Property::ScrollContainerLayer)) { if (!m_scrollViewDelegate) m_scrollViewDelegate = adoptNS([[WKScrollingNodeScrollViewDelegate alloc] initWithScrollingTreeNodeDelegate:this]); } }void ScrollingTreeScrollingNodeDelegateIOS::commitStateAfterChildren(const ScrollingStateScrollingNode& scrollingStateNode){ //...... if (scrollingStateNode.hasChangedProperty(ScrollingStateNode::Property::ScrollContainerLayer)) { if (!m_scrollViewDelegate) m_scrollViewDelegate = adoptNS([[WKScrollingNodeScrollViewDelegate alloc] initWithScrollingTreeNodeDelegate:this]); } }
搜索webkit的源碼,發(fā)現(xiàn)創(chuàng)建WKScrollingNodeScrollViewDelegate的位置只有一處。但是webkit的源碼太過于復(fù)雜,無法通過閱讀源碼的方式知道WKScrollingNodeScrollViewDelegate屬于哪個scrollview。
為此我們只能換一種思路,我們通過xcode調(diào)試的方式查看當(dāng)前webview加載的頁面是否還有其他scrollview。
頁面上剛好還有一個scrollview:WKChildScrollview
這個WKChildScrollview 是否是崩潰堆棧中的scrollview呢,如果我們能確定他的delegate是WKScrollingNodeScrollViewDelegate,那就說明這個WKChildScrollview 是崩潰堆棧中的scrollview。
為了驗證這個猜想,我們首先找到源碼,源碼并沒有太多,看不出其delegate類型。
@interface WKChildScrollView : UIScrollView @end@interface WKChildScrollView : UIScrollView @end
我們只能轉(zhuǎn)換思路在運(yùn)行時找到WKWebView的類型為WKChildScrollView的子view(通過OC runtime & 視圖樹遍歷的方式),判斷他的delegate是否為WKScrollingNodeScrollViewDelegate 。
我們運(yùn)行時找到類型為 WKChildScrollView 的子view后,獲取其delegate類型,確實是WKScrollingNodeScrollViewDelegate。至此我們找到了崩潰堆棧中的scrollview。
確定了崩潰堆棧中的scrollview的類型,那么修復(fù)起來也比較容易了。在頁面生命周期的viewDidAppear方法里,獲取類型為 WKChildScrollView的子view。然后在dealloc方法里,將其delegate置空即可。
deinit { if self.childScrollView != nil { if self.childScrollView?.delegate != nil { self.childScrollView?.delegate = nil } }}deinit { if self.childScrollView != nil { if self.childScrollView?.delegate != nil { self.childScrollView?.delegate = nil } }}
4.3 小程序同層渲染想完了解決方案,那么WKChildScrollView 是做啥用的呢?
WKWebView 在內(nèi)部采用的是分層的方式進(jìn)行渲染,它會將 WebKit 內(nèi)核生成的 Compositing Layer(合成層)渲染成 iOS 上的一個 WKCompositingView,這是一個客戶端原生的 View,不過可惜的是,內(nèi)核一般會將多個 DOM 節(jié)點渲染到一個 Compositing Layer 上,因此合成層與 DOM 節(jié)點之間不存在一對一的映射關(guān)系。當(dāng)把一個 DOM 節(jié)點的 CSS 屬性設(shè)置為overflow: scroll(低版本需同時設(shè)置-webkit-overflow-scrolling: touch)之后,WKWebView 會為其生成一個WKChildScrollView,與 DOM 節(jié)點存在映射關(guān)系,這是一個原生的UIScrollView的子類,也就是說 WebView 里的滾動實際上是由真正的原生滾動組件來承載的。WKWebView 這么做是為了可以讓 iOS 上的 WebView 滾動有更流暢的體驗。雖說WKChildScrollView也是原生組件,但 WebKit 內(nèi)核已經(jīng)處理了它與其他 DOM 節(jié)點之間的層級關(guān)系,這一特性可以用來做小程序的同層渲染。(「同層渲染」顧名思義則是指通過一定的技術(shù)手段把原生組件直接渲染到 WebView 層級上,此時「原生組件層」已經(jīng)不存在,原生組件此時已被直接掛載到 WebView 節(jié)點上。你幾乎可以像使用非原生組件一樣去使用「同層渲染」的原生組件,比如使用view、image覆蓋原生組件、使用z-index指定原生組件的層級、把原生組件放置在scroll-view、swiper、movable-view等容器內(nèi)等等)。
5、蘋果的修復(fù)方案本著嚴(yán)謹(jǐn)?shù)膽B(tài)度,我們想是什么導(dǎo)致了最開始的崩潰堆棧呢?是我們開發(fā)過程中的功能還是系統(tǒng)bug?如果是系統(tǒng)bug,其他公司也可能遇到,但是互聯(lián)網(wǎng)上搜不到其他公司或開發(fā)者討論崩潰相關(guān)信息。我們繼續(xù)看一下崩潰堆棧的top 函數(shù)RemoteScrollingTree::scrollingTreeNodeDidScroll() 源碼如下:
void RemoteScrollingTree::scrollingTreeNodeDidScroll(ScrollingTreeScrollingNode& node, ScrollingLayerPositionAction scrollingLayerPositionAction){ ASSERT(isMainRunLoop()); ScrollingTree::scrollingTreeNodeDidScroll(node, scrollingLayerPositionAction); if (!m_scrollingCoordinatorProxy) return; std::optional layoutViewportOrigin; if (is(node)) layoutViewportOrigin = downcast(node).layoutViewport().location(); m_scrollingCoordinatorProxy->scrollingTreeNodeDidScroll(node.scrollingNodeID(), node.currentScrollPosition(), layoutViewportOrigin, scrollingLayerPositionAction);}void RemoteScrollingTree::scrollingTreeNodeDidScroll(ScrollingTreeScrollingNode& node, ScrollingLayerPositionAction scrollingLayerPositionAction){ ASSERT(isMainRunLoop()); ScrollingTree::scrollingTreeNodeDidScroll(node, scrollingLayerPositionAction); if (!m_scrollingCoordinatorProxy) return; std::optional layoutViewportOrigin; if (is(node)) layoutViewportOrigin = downcast(node).layoutViewport().location(); m_scrollingCoordinatorProxy->scrollingTreeNodeDidScroll(node.scrollingNodeID(), node.currentScrollPosition(), layoutViewportOrigin, scrollingLayerPositionAction);}
崩潰在這個函數(shù)里,查看這個函數(shù)的commit記錄:
簡單描述一下就是scrollingTreeNodeDidScroll方法中使用的m_scrollingCoordinatorProxy 對象改成weak指針,并進(jìn)行判空操作。這種改變,正是解決m_scrollingCoordinatorProxy 內(nèi)存被釋放后還在訪問的方案。
這個commit是2023年2月28號提交的,commit log是:
[UI-side compositing] RemoteScrollingTree needs to hold a weak ref to the RemoteScrollingCoordinatorProxyhttps://bugs.webkit.org/show_bug.cgi?id=252963rdar://105949247Reviewed by Tim Horton.The scrolling thread can extend the lifetime of the RemoteScrollingTree via activity on that thread,so RemoteScrollingTree needs to hold a nullable reference to the RemoteScrollingCoordinatorProxy;use a WeakPtr.[UI-side compositing] RemoteScrollingTree needs to hold a weak ref to the RemoteScrollingCoordinatorProxyhttps://bugs.webkit.org/show_bug.cgi?id=252963rdar://105949247Reviewed by Tim Horton.The scrolling thread can extend the lifetime of the RemoteScrollingTree via activity on that thread,so RemoteScrollingTree needs to hold a nullable reference to the RemoteScrollingCoordinatorProxy;use a WeakPtr.
至此,我們基本確認(rèn),這個崩潰堆棧是webkit內(nèi)部實現(xiàn)的一個bug,蘋果內(nèi)部開發(fā)者最終使用弱引用的方式解決。
同時修復(fù)上線后,這個crash的崩潰量也降為0。
6、總結(jié)本文中的crash從出現(xiàn)到解決歷時近一年,一開始根據(jù)線上日志判斷是h5 頁面返回 & h5 頁面滾動導(dǎo)致的問題,禁用手勢后雖然幾乎解決問題,但是線上還有零星crash上報,因此為了保證h5 離線功能的線上穩(wěn)定性,需要完美解決問題。
本文的crash 似曾相識,但是經(jīng)過驗證和閱讀源碼后發(fā)現(xiàn)并不是想象的那樣,繼續(xù)通過猜想+閱讀源碼的方式尋找到了崩潰堆棧中的真正scrollview代理對象,從而在app 側(cè)解決問題。最后發(fā)現(xiàn)是蘋果webkit的bug。
本文中的崩潰問題本質(zhì)上是野指針問題,那么野指針問題定位有沒有通用的解決方案呢?
標(biāo)簽:
推薦
-
數(shù)據(jù)偏度介紹和處理方法|環(huán)球看熱訊
偏度(skewness)是用來衡量概率分布或數(shù)據(jù)集中不對稱程度的統(tǒng)計量。它描述了數(shù)據(jù)分布的尾部(tail)在平均
來源: -
環(huán)球最新:馬斯克稱中國航天工程計劃更加超前
中國載人航天工程在5月29日的新聞發(fā)布會上公布了下一步的發(fā)展計劃,明確表示目標(biāo)是2030年前實現(xiàn)中國人首次
來源: -
“白發(fā)姑蘇”傳承煥新——二千五百年古城的人文經(jīng)濟(jì)嬗變
“白發(fā)姑蘇”傳承煥新——二千五百年古城的人文經(jīng)濟(jì)嬗變---作為全國唯一國家歷史文化名城保護(hù)區(qū),位于姑...
來源: -
前沿資訊!長征二號F火箭點火發(fā)射 神舟十六號載人飛船奔赴空間站
本文轉(zhuǎn)自:人民網(wǎng)人民網(wǎng)酒泉5月30日電(記者翁奇羽、趙竹青)5月30日上午,搭載神舟十六號載人飛船的長征二
來源: -
李開復(fù):AI 2.0將帶來比移動互聯(lián)網(wǎng)大十倍顛覆性機(jī)會
在2023中關(guān)村論壇“人工智能大模型發(fā)展”分論壇上,,創(chuàng)新工場董事長兼CEO李開復(fù)談及了他對AI2 0浪潮的...
來源: -
英偉達(dá)將推AI超級計算機(jī)比上代內(nèi)存擴(kuò)500倍_天天新消息
英偉達(dá)(Nvidia)將推出AI超級計算機(jī)DGXGH200,與上一代相比內(nèi)存擴(kuò)大500倍。英偉達(dá)CEO黃仁勛稱它“集成了英偉
來源: -
一張精工“面膜”背后的“獨門絕技”|當(dāng)前快報
一張精工“面膜”背后的“獨門絕技”---如果說傳統(tǒng)工業(yè)制品是用磨具磨料這個工業(yè)“牙齒”啃出來的,那么...
來源: -
每日消息!豪江智能深交所公開招股
豪江智能專業(yè)提供智能家居、智慧醫(yī)養(yǎng)、智能辦公、工業(yè)傳動等應(yīng)用領(lǐng)域的智能線性驅(qū)動類產(chǎn)品,已成為業(yè)界知名
來源: -
全球最資訊丨金碚:挖掘工業(yè)機(jī)器人產(chǎn)業(yè)潛力
金碚:挖掘工業(yè)機(jī)器人產(chǎn)業(yè)潛力---一段時間以來,工業(yè)機(jī)器人市場蓬勃發(fā)展,市場規(guī)模創(chuàng)下歷史新高。如何更好
來源: -
互聯(lián)網(wǎng)含人量創(chuàng)新低:你的聊友或許連摳腳大漢都不是|當(dāng)前關(guān)注
奇異新概念“互聯(lián)網(wǎng)含人量”,足夠引起大家的驚詫:你日常面對的網(wǎng)絡(luò)社交對象、聊友、飯圈、粉團(tuán)、客服...
來源: -
環(huán)球速讀:磁電阻效應(yīng)(關(guān)于磁電阻效應(yīng)介紹)
來為大家講解以上的問題。磁電阻效應(yīng),電阻效應(yīng)介紹這個很多人還不知道,我們一起來看看!1、在通有電流的金
來源: -
環(huán)球今日報丨Quest 3或?qū)⒊蔀樘O果MR最大挑戰(zhàn)者
據(jù)報道,彭博專欄作家馬克·古爾曼上周上手試用了尚未發(fā)布的Quest3混合現(xiàn)實頭顯。在他看來,這是同樣尚...
來源: -
油價年內(nèi)第4漲將至,95號汽油或重回8元時代
油價年內(nèi)第4漲將至,95號汽油或重回8元時代---中國經(jīng)濟(jì)網(wǎng)北京5月30日訊(記者王婉瑩)新一輪油價調(diào)整,又要
來源: -
焦點信息:36氪研究院 | 2023年中國實時音視頻(RTC)行業(yè)洞察報告
早在2015年左右,直播和短視頻的興起帶動人們信息消費(fèi)的內(nèi)容逐漸從文字向語音、視頻信息轉(zhuǎn)變,加之全民
來源: -
凱迪拉克新款CT6、XT4、GT4上市-環(huán)球觀熱點
凱迪拉克新款CT6、XT4、GT4三款車型上市,官方指導(dǎo)價分別為35 97萬-46 97萬元、22 97萬-27 57萬元、21 97萬
來源: -
發(fā)揮人口對經(jīng)濟(jì)社會發(fā)展的能動作用_天天時訊
發(fā)揮人口對經(jīng)濟(jì)社會發(fā)展的能動作用---二十屆中央財經(jīng)委員會第一次會議指出,當(dāng)前我國人口發(fā)展呈現(xiàn)少子化、
來源: -
直播帶貨要創(chuàng)新更要規(guī)范 當(dāng)前簡訊
直播帶貨要創(chuàng)新更要規(guī)范---日前,經(jīng)濟(jì)日報攜手京東發(fā)布數(shù)據(jù)顯示,2023年一季度對比2021年一季度,醫(yī)藥產(chǎn)品
來源: -
每日熱議!山姆回應(yīng)同款蛋糕上海、杭州差價大
近日,有網(wǎng)友在社交平臺上發(fā)帖“同樣的蛋糕杭州比上海貴這么多”,內(nèi)容為在山姆超市APP內(nèi),一款名為“Th...
來源: -
世界百事通!彰顯自貿(mào)試驗區(qū)“排頭兵”作用
彰顯自貿(mào)試驗區(qū)“排頭兵”作用---商務(wù)部數(shù)據(jù)顯示,今年一季度,我國自貿(mào)試驗區(qū)外貿(mào)外資實現(xiàn)較快增長。21...
來源: -
國博推出原創(chuàng)文物活化舞臺劇《盛世歡歌》
中國社會科學(xué)網(wǎng)訊(記者呂家佐)頭上戴幘,袒胸露腹,著褲赤足,左臂環(huán)抱一扁鼓,右手舉槌欲擊……5月27...
來源: -
2022年我國海洋生態(tài)環(huán)境狀況穩(wěn)中趨好 海水環(huán)境質(zhì)量總體保持穩(wěn)定
央視網(wǎng)消息:今天(5月29日)的生態(tài)環(huán)境部發(fā)布會,同時還發(fā)布了《2022年中國海洋生態(tài)環(huán)境狀況公報》。公報
來源: -
索尼全新PS掌機(jī)Q將問世:10年沒更新這條產(chǎn)品線了 天天快資訊
2023-05-30 05:01:16 作者:人寶寶本周,索尼發(fā)布了一款名為“Project Q”的PlayStation掌上設(shè)備。不
來源: -
每日精選:位圖與矢量圖的區(qū)別是什么(位圖與矢量圖區(qū)別)
1、矢量圖像,也稱為面向?qū)ο蟮膱D像或繪圖圖像,在數(shù)學(xué)上定義為一系列由線連接的點。2、矢量文件中的圖形元
來源: -
榮耀90系列發(fā)布:2億像素相機(jī)+升維影像引擎,實力提升拍攝體驗 環(huán)球熱文
時隔半年,榮耀在成都發(fā)布了全新一代的數(shù)字系列手機(jī)——榮耀90系列,其中包括榮耀90和榮耀90Pro兩款機(jī)型...
來源: -
華為小米同時上榜 23年Q1全球高端手機(jī)銷量排名公布 頭條
【手機(jī)中國新聞】在2023年上半年,全球智能手機(jī)市場的出貨量依然在下跌。不過,根據(jù)Canalys的調(diào)查數(shù)據(jù),
來源: -
觀熱點:?中超戰(zhàn)報:武磊2度中框3外援建功!海港3-0亞泰5連勝6分優(yōu)勢領(lǐng)跑
北京時間5月29日,中超第10輪的最后一場比賽,長春亞泰坐鎮(zhèn)主場迎戰(zhàn)上海海港。第11分鐘,卡隆賽季首球為海
來源: -
海信家電集團(tuán)董事長代慧忠當(dāng)選廣東省家電商會第六屆會長_世界視點
廣東省家電商會第六屆會員代表大會暨廣東家電行業(yè)高質(zhì)量發(fā)展論壇在廣州隆重舉行。經(jīng)選舉,海信家電集團(tuán)董事
來源: -
西安機(jī)場2023年首乘服務(wù)升級 “中轉(zhuǎn)+旅游”產(chǎn)品發(fā)布-微動態(tài)
西安機(jī)場2023年首乘服務(wù)升級“中轉(zhuǎn)+旅游”產(chǎn)品發(fā)布---中新網(wǎng)西安5月29日電29日,西安咸陽國際機(jī)場(以下...
來源: -
45歲摩納哥王妃胖這么多?閃耀F1大獎賽晚宴好壯實,臉還是很精致
摩納哥王妃現(xiàn)在真是在認(rèn)真履行著王妃的職責(zé),自從回歸到王室后,就經(jīng)常和摩納哥親王一起營業(yè),狀態(tài)也是越來
來源: -
104平現(xiàn)代風(fēng)三居室背景干凈利落,客廳讓人感覺好有格調(diào)
104平米的三居室,裝修花了大半年,裝完效果美翻了。下面就給大家介紹一下我家104平現(xiàn)代風(fēng)三居室格的裝修設(shè)
來源:
財富更多》
-
全球最資訊丨金碚:挖掘工業(yè)機(jī)器人產(chǎn)業(yè)潛力
金碚:挖掘工業(yè)機(jī)器人產(chǎn)業(yè)潛力---一段時...
-
最大“黑客帝國”非美莫屬-頭條
最大“黑客帝國”非美莫屬---近日,有美...
-
“以我為主”釋放市場化改革效能
“以我為主”釋放市場化改革效能---作為...
-
一張精工“面膜”背后的“獨門絕技”|當(dāng)前快報
一張精工“面膜”背后的“獨門絕技”---...
-
“白發(fā)姑蘇”傳承煥新——二千五百年古城的人文經(jīng)濟(jì)嬗變
“白發(fā)姑蘇”傳承煥新——二千五百年古...
動態(tài)更多》
-
環(huán)球速讀:磁電阻...
-
2022年我國海洋生...
-
每日精選:位圖與...
-
黑棗的功效與作用...
-
觀熱點:?中超戰(zhàn)...
-
最強(qiáng)進(jìn)化_對于最強(qiáng)...
熱點
- realme10系列正式宣布 采用雙曲面屏正面頂部居中挖孔
- 五菱全新微型電動車內(nèi)飾官圖發(fā)布 座椅采用星際形打孔工藝
- 努比亞Z40星空典藏版正式開售 采用微米級油畫筆觸紋理技術(shù)
- iQOO11系列正式官宣 首批搭載驍龍8Gen2機(jī)型之一
- 海信34英寸帶魚屏顯示器發(fā)布 支持165Hz刷新率
- OPPO明年將商用240W超級閃充 新一代電芯支持更高倍率充電
- 第一款A(yù)ndroid手機(jī)渲染圖曝光 橫向滑蓋設(shè)計和全尺寸鍵盤
- 吉利首款純電皮卡11月9日上市 車輛續(xù)航里程超過610公里
- 努比亞Z40SPro星空典藏版正式公布 堪稱窄邊框天花板
- vivo無線運(yùn)動耳機(jī)2今日正式上市 首銷只要119元
- 最強(qiáng)進(jìn)化_對于最強(qiáng)進(jìn)化簡單介紹
- 互動 北汽藍(lán)谷:目前SiC電機(jī)控制器已經(jīng)處于研轉(zhuǎn)產(chǎn)的階段 正在進(jìn)行第三輪可靠耐久測試_熱推薦
- 【世界快播報】溫暖“童”行,長壽這場培訓(xùn)教你如何贏得孩子的心!
- 環(huán)球快資訊丨旬月在古文是什么意思_古文的旬是什么意思
- 銀魂哪一集是神威出場_銀魂第三季神威出場了嗎|全球快看點
- 戀愛恐懼癥的癥狀_戀愛恐懼癥的24個表現(xiàn) 戀愛恐懼癥有什么表現(xiàn)
- 微動態(tài)丨力爭突破100億元!2023臨沂實施水利項目工程數(shù)量及投資額均居全省第一
- 證明信的格式及范文調(diào)職_證明信的格式及范文
- 快消息!講歷史的節(jié)目誰講得好(講歷史的節(jié)目)
- 后搖音樂代表作_后搖音樂
- “杭州傘” “玉琮館” 這些亞運(yùn)場館科技感爆棚_天天微資訊
- 焦點消息!中國信通院“OSCAR合規(guī)治理沙龍”在京召開 騰訊、阿里等企業(yè)共話開源生態(tài)建設(shè)
- 當(dāng)前動態(tài):基金調(diào)研丨Harding Loevner基金調(diào)研漢鐘精機(jī)
- 當(dāng)前觀點:最新!河南要求:優(yōu)先保住小麥種子、落實跨區(qū)機(jī)收免費(fèi)通行......
- 中超:深圳勝梅州客家
- 天天時訊:情感與現(xiàn)實:探秘斯皮爾伯格如何通過電影讓人深思人生
- 北京檢察機(jī)關(guān)依法對周茂非涉嫌貪污、受賄案提起公訴
- 直播預(yù)告:今日中午專家教你居家推拿治療頸腰椎???|環(huán)球快播
- 福建進(jìn)一步加強(qiáng)房地產(chǎn)項目預(yù)售資金監(jiān)管 違規(guī)企業(yè)將暫停銷售
- 瀘水縣氣象臺發(fā)布高溫橙色預(yù)警信號【Ⅱ級/嚴(yán)重】【2023-05-29】 天天滾動
- 皇社十年的等待!久保建英發(fā)文慶祝:歐冠,我們來啦!
- 天孚通信:控股股東擬減持公司不超0.75%股份
- 迎接賽末沖刺階段!
- 天天百事通!棲霞建設(shè): 棲霞建設(shè)持股5%以上股東集中競價減持股份計劃時間屆滿暨結(jié)果公告
- 小舞成神造型終于來了,頭發(fā)完全散開,身穿白色蕾絲樣子仙哭|視焦點訊
- 世界熱文:海賊王:收視率最高的一集,只因娜美這這位侍女的迷之走光!
- 環(huán)球熱推薦:海水環(huán)境質(zhì)量總體保持穩(wěn)定 2022年我國海洋生態(tài)環(huán)境狀況穩(wěn)中趨好
- 618職場福利!華為HarmonyOS 3 double職場生產(chǎn)力|環(huán)球播報
- 世界快資訊:一餓就心慌渾身無力發(fā)抖需要治療嗎(一餓就心慌渾身無力發(fā)抖)
- 當(dāng)虹科技與三六零集團(tuán)簽約:開展內(nèi)容審核項目合作|全球時訊
- 土耳其第一次舉辦總統(tǒng)選舉第二輪投票 充滿了不確定性 全球聚看點
- 最新快訊!36氪晚報丨波音將在零部件供應(yīng)鏈等領(lǐng)域與越南合作;渣打與普華永道中國聯(lián)合發(fā)布白皮書;五糧液參股創(chuàng)投企業(yè)投資新能源公司
- 經(jīng)濟(jì)日報:為農(nóng)機(jī)跨區(qū)作業(yè)提供有溫度的服務(wù)|當(dāng)前訊息
- 無人駕駛礦山運(yùn)輸機(jī)器人"載山CarMo"正式投入使用|焦點滾動
- 天天熱點評!吉林省前4月規(guī)上工業(yè)快速增長
- 波士頓咨詢公司報告:中國時尚行業(yè)將呈現(xiàn)量穩(wěn)質(zhì)升趨勢
- eFishery 完成規(guī)模為1.08億美元的D輪融資,軟銀等參投
- 講述“這一屆”職場人的故事
- 新增多項實用功能,廣汽傳祺影酷迎新版本OTA升級-全球資訊
- 環(huán)球新消息丨V觀財報|張家界收年報問詢函:為何凈利潤連續(xù)三年虧損?
- 隆基5月單晶硅片價格公示 平均價格下調(diào)約30%
- 深圳時尚家居設(shè)計周圓滿閉幕,德國 88 年品牌樂德飛翼
- 工業(yè)富聯(lián)漲6.6% 機(jī)構(gòu)凈賣出7.15億元
- 環(huán)球觀速訊丨兩部門:推動大企業(yè)加強(qiáng)計量引領(lǐng)帶動,促大中小企業(yè)融通發(fā)展
- 華電國際漲停 機(jī)構(gòu)凈買入1.76億元
- 戴威美國二次創(chuàng)業(yè)項目陷入困境:資金鏈?zhǔn)茏?擴(kuò)張徹底停滯 天天速讀
- 焦點滾動:布吉人民醫(yī)院婦科怎么樣 布吉婦科醫(yī)院
- 焦點快看:報告稱2025年中國分布式存儲市場規(guī)模將超200億元
- 臺灣5月消費(fèi)者信心指數(shù)回升 學(xué)者指“反映短期效應(yīng)”
- iPhone16Pro機(jī)型為6.3和6.9英寸,屏幕加大只因這個組件 焦點播報
- 每日熱文:18元一斤?消費(fèi)者大呼西瓜貴了 一小塊瓜要5元
- 廢鋼跌勢趨緩,跟隨成材運(yùn)行
- 硅動力6月5日上交所首發(fā)上會 擬募資6.9億元|速遞
- 全球快播:少年中國問丨量子計算如何改變我們的生活?
- 江西移動與南昌市人民政府深化戰(zhàn)略合作
- 思密達(dá)全新劑型蒙脫石混懸液上市
- 微信:治理個人帳號發(fā)布違禁品營銷信息行為 世界觀速訊
- 東方通跌15.64% 機(jī)構(gòu)凈賣出7416萬元_天天即時看
- 航錦科技跌9.57% 機(jī)構(gòu)凈賣出9469萬元 短訊
- 全球視點!光子芯片溫控耗能減至目前的百萬分之一 可用于未來數(shù)據(jù)中心和超級計算機(jī)通信網(wǎng)絡(luò)
- 2023中關(guān)村論壇|精彩繼續(xù) 中關(guān)村國際技術(shù)交易大會不落幕 天天看熱訊
- 工行淮安城北支行貫徹學(xué)習(xí)二十大“四輪驅(qū)動”推進(jìn)網(wǎng)點競爭力提升_實時焦點
- 生態(tài)環(huán)境部:穩(wěn)步擴(kuò)大火電、鋼鐵等行業(yè)碳監(jiān)測評估
- 北京海淀區(qū)20所中小學(xué)授牌“非遺傳承基地?!?/a>
- 科技部火炬中心黨委書記呂先志:去年177家國家高新區(qū)園區(qū)生產(chǎn)總值占國內(nèi)GDP比重13.9%_全球信息
- 觀熱點:文遠(yuǎn)知行獲ISO/SAE 21434汽車網(wǎng)絡(luò)安全流程認(rèn)證
- 工信部:1-4月份我國軟件業(yè)務(wù)收入33166億元,同比增長12.8%
- 北京米揚(yáng)麗格夏正義院長:關(guān)于舒鉑材料的臨床實踐 暨纖鉑新品上市
- 為什么現(xiàn)在的演唱會都不能選位置?|全球訊息
- 清肺排毒湯_清肺
- 切瓦特·埃加福特加盟《毒液3》 漫威再就業(yè) 天天資訊
- 米蘭鎖定前四,皮奧利用人釋放信號:有人急需挽留,有人放棄治療
- 不屑,姆巴佩突爆爭議采訪!皇馬底蘊(yùn)成笑話,佛爺知道C羅多好了
- HKC惠科發(fā)布首款QHD 500Hz顯示器:40-500Hz可變高刷、雙百色域 全球簡訊
- 天合光能跌16.34% 機(jī)構(gòu)凈賣出4.52億元
- 環(huán)球熱門:Patient21獲得1.08億美元C輪融資
- 天津港集團(tuán)與ABB公司簽署戰(zhàn)略合作協(xié)議|環(huán)球熱文
- 世界簡訊:渝北雙鳳橋街道:做好燃?xì)庾蚤]閥安裝工作 筑牢群眾生命安全防線
- 特斯拉聲明:目前沒有與任何第三方進(jìn)行招聘活動-每日訊息
- 觀天下·美債危機(jī)|媒體和業(yè)內(nèi)人士:美國債務(wù)上限協(xié)議達(dá)成未必是“好消息”_天天簡訊
- 觀天下!通富微電漲10% 機(jī)構(gòu)凈買入3.3億元
- 華為開發(fā)者大會2023 ( Cloud ) 將于7月7日正式揭幕-微動態(tài)
- 高三備考好兄弟Brother DCP-T426W打印機(jī)
- 最高法、全國婦聯(lián)發(fā)布保護(hù)未成年人權(quán)益司法救助典型案例 環(huán)球報道
- 鵬都農(nóng)牧跌9.95% 機(jī)構(gòu)凈賣出5105萬元
- 教師辦公必備好物Brother DCP-B7535DW打印機(jī)
- 花旗銀行開戶條件門檻_花旗銀行開戶條件
- 榮耀90系列全新發(fā)布,全系標(biāo)配2億像素寫真相機(jī)影像升維_當(dāng)前熱門
- 每日精選:開發(fā)“在線預(yù)約”,創(chuàng)新旅游業(yè)服務(wù) 在家“動動手”,出游更省心
- 臺北電腦展上英偉達(dá)(NVDA.US)公布了哪些產(chǎn)品和服務(wù)?-天天視點
- 滾動:18年前失蹤兒子,線索斷裂
- 榮耀90系列全新發(fā)布,全系標(biāo)配2億像素寫真相機(jī)影像升維_焦點快播
- 百度地圖2023年第一季度中國城市交通報告:廣東人通勤出行最幸福|環(huán)球速看
- 全球今亮點!吳若曼新任興銀基金董事長兼法定代表人 張貴云離任
- 每日精選:電影《長空之王》香港票房超11萬美元
- 兩部門聯(lián)合印發(fā)《關(guān)于實施中小企業(yè)計量伙伴計劃的通知》
- 第25屆上海國際電影節(jié)金爵獎入圍影片名單揭曉 速讀
- 當(dāng)前視點!現(xiàn)代和起亞宣布與FIFA的合作伙伴關(guān)系延長至2030年
- 天天新動態(tài):平安基金成鈞離任2只ETF
- 國投瑞銀瑞盛混合(LOF)增聘基金經(jīng)理賀明之 全球熱頭條
- 中微電科技完成新一輪融資-全球速訊
- 每日看點!Checkmate.獲得1500萬美元A輪融資
- 匯豐晉信基金副總經(jīng)理兼首席運(yùn)營官趙琳離任|實時
- 當(dāng)前快看:醫(yī)療冷鏈有哪些股票?醫(yī)療冷鏈概念股票一覽
- 世界今日訊!光伏組件概念股名單一覽(2023A股光伏組件概念上市公司)
- 光伏發(fā)電投資額同比大增 機(jī)構(gòu)看好光伏設(shè)備高景氣
- 環(huán)球動態(tài):神舟十五號乘組即將返回 創(chuàng)出艙次數(shù)最多等多項紀(jì)錄
- 世界今日報丨海洛創(chuàng)新獲千萬元Pre-A輪融資
- 視頻解析工具Video-ChatGPT上線 可用文本描述視頻內(nèi)容 世界新動態(tài)
- Sabi Am獲得3800萬美元B輪融資
- 競賽聚英才 第二屆"長江杯"動力電池技術(shù)挑戰(zhàn)賽決賽開幕
- 租房難?一德國男子使用ChatGPT 找到滿意的房子 全球微資訊
- 業(yè)界:提升農(nóng)業(yè)社會化服務(wù)水平 讓小農(nóng)戶融入大產(chǎn)業(yè)大市場_世界關(guān)注
- 【環(huán)球時快訊】收評:創(chuàng)業(yè)板指跌1.14% 電力板塊全天強(qiáng)勢
- 【當(dāng)前熱聞】全國首個無人島島主成“老賴” 名下海島起價2785萬流拍
- 天天快看:種地吧出品方申請后陡門商標(biāo) 種地吧出品方申請十個勤天商標(biāo)
- 天天觀熱點:次北固山下的意思簡短一點_次北固山下的意思簡介介紹
- 全球看點:議論“校園碾壓案”家長妝容,這是無聊更是殘忍
- 當(dāng)前快播:豆瓣8.1,這世界也容不下男孩的親密友誼
- 搞了半天,高德打車無證卻變相從事網(wǎng)約車經(jīng)營,一喂等平臺吃瓜了
- 華為發(fā)布商業(yè)市場新品,助力數(shù)字化轉(zhuǎn)型_每日播報
- 寶馨科技攜新能源領(lǐng)域多項最新研發(fā)和應(yīng)用成果亮相SNEC展會 每日熱點
- 外媒:特斯拉數(shù)據(jù)或“大規(guī)?!毙孤?,涉及馬斯克信息-全球消息
- Orbofi AI獲得280萬美元戰(zhàn)略投資-全球聚看點
- 潤貝航科(001316):該股換手率大于8%(05-29)-聚看點