国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

德宏網(wǎng)站建設在線識別圖片來源

德宏網(wǎng)站建設,在線識別圖片來源,課程網(wǎng)站開發(fā)與設計,漢化主題 wordpress文章目錄前言47.熟悉系統(tǒng)框架CoreFoundation框架其他框架要點48. 多用塊枚舉,少用for循環(huán)for循環(huán)NSEnumerator遍歷快速遍歷基于塊的遍歷方式要點49.對自定義其內(nèi)存管理語義的collection使用無縫橋接要點50.構(gòu)建緩存時選用NSCache而非NSDictionaryNSCacheNSCache實例…

文章目錄

  • 前言
  • 47.熟悉系統(tǒng)框架
        • CoreFoundation框架
        • 其他框架
    • 要點
    • 48. 多用塊枚舉,少用for循環(huán)
        • for循環(huán)
        • NSEnumerator遍歷
        • 快速遍歷
        • 基于塊的遍歷方式
    • 要點
  • 49.對自定義其內(nèi)存管理語義的collection使用無縫橋接
    • 要點
  • 50.構(gòu)建緩存時選用NSCache而非NSDictionary
        • NSCache
        • NSCache實例
    • 要點
  • 51.精簡initialize與load的實現(xiàn)代碼
        • load
        • initalize
        • initalize方法盡量精簡
    • 要點
  • 52.別忘了NSTimer會保留其目標對象
        • 創(chuàng)建計時器
        • 保留環(huán)
        • 使用塊的特點打破保留環(huán)
    • 要點
  • 總結(jié)

前言

小藍書的最后一張學習的主要內(nèi)容是OC的系統(tǒng)框架,對于OC而言Foundation框架是OC最基本最重要的框架了

47.熟悉系統(tǒng)框架

OC的Foundation框架,像NSObject NSArray, NSDictionary等類都在其中。Foundation框架里的類都是用NS前綴,因為OC之前作為NeXTSTEP操作系統(tǒng)確定的。

將一系列代碼封裝為動態(tài)庫,并在其中放入描述其接口的頭文件,這樣做出來的東西就叫框架。

CoreFoundation框架

Foundation框架提供了collection等基礎核心功能,而且還提供了字符串處理等復雜功能。還存在一個CoreFoundation框架,在之前了解過他是不屬于OC框架之內(nèi)的,但是OC應用程序的編寫離不開這個框架,Foundation框架的許多功在CoreFoundation框架都可以找到對應的C語言API

他其中的很多類都和Foundation框架相似,并且我們還可以通過“無縫橋接”功能實現(xiàn)CoreFoundation框架中的C語言數(shù)據(jù)結(jié)構(gòu)平滑轉(zhuǎn)換為Foundation框架中的OC對象,也可以反向轉(zhuǎn)換。無縫橋接技術(shù)是用某些相當復雜的代碼實現(xiàn)出來的,這些代碼可以使運行期系統(tǒng)把CoreFoundation框架中的對象視為普通的OC對象。

NSString所對應的就是CFString對象。

其他框架

  • CFNetWork 此框架提供了 C語言級別的網(wǎng)絡通信能力,它將 “BSD 套接字"(BSDsockeD) 抽象成易于使用的網(wǎng)絡接口。而Foundation 則將該框架里的部分內(nèi)容封裝為
    Objective-c語言的接口,以便進行網(wǎng)絡通信,例如可以用 NSURLConncction 從 URI
    中下載數(shù)據(jù)。
  • CoreAudio 該框架所提供的C語言 APT可用來操作設備上的音頻硬件。這個框架屆手比較難用的那科,因為育頻處理本身就很復東。所幸由這套 ^PL 可以抽象出另外一套Objective-C 式 API,用后者米處理音頻問題會更簡單些。
  • AvFoundation 此框架所提供的 Objective-C對象可用水回放并錄制音頻及視頻,比如能碰在 UI視兇類里播放視物。
  • CoreData 此框架所提供的 Objective-C 按口可將對象放人數(shù)據(jù),便于特久保存。
    CoreData 會處理數(shù)據(jù)的狀取及存儲事宜,而且可以路越 Mac OS X 及 iOS 平臺。
  • CoreText 此框架提供的 C諾青接口可以高效執(zhí)行文字排版及誼染操作。

OC編程的重要特點就是:經(jīng)常需要使用底層的C語言級 API。用c語言實現(xiàn) APTI的好處是,可以統(tǒng)過 Objeotive-C 的運行期系統(tǒng),從而提升執(zhí)行速度

在編寫新的工具類之前可以在系統(tǒng)框架搜一下,通常有寫好的類可以供直接使用

要點

  • 許多系統(tǒng)框架都可以直接使用。其中最重要的是Foundation與CoreFoundation,這兩個框架提供了構(gòu)建應用程序所需的許多核心功能。
  • 很多常見任務都能用框架來做,例如音頻與視頻處理、網(wǎng)絡通信、數(shù)據(jù)管理等。
  • 請記住:用純C寫成的框架與用OC寫成的一樣重要,若想成為優(yōu)秀的OC開發(fā)者,應該掌握C語言的核心概念。

48. 多用塊枚舉,少用for循環(huán)

在OC里,列舉collection中的元素可以使用C語言的for循環(huán),還可以使用快速遍歷。當學習了block塊特性的時候,又提供了多種遍歷collection的方式,可以傳入塊。

for循環(huán)

遍歷數(shù)組的時候for循環(huán)最基本

- (void)forMethod {NSArray *testArray = @[@"kd", @"lbj", @"Curry", @"KW", @"@PG"];for (int i = 0; i < testArray.count; i++) {// 操作數(shù)組}
}

不過對于字典或者集合,字典和set都是無序的,所以要先把它轉(zhuǎn)換為數(shù)組才可以正常使用for循環(huán)來使用

 NSDictionary *textDic = @{@"LA": @"LBJ", @"PHX" :@"KD"};NSArray *allKeys = [textDic allKeys];for (int i = 0; i < allKeys.count; i++) {// 操作字典或集合}

for循環(huán)還有個比較好的地方就是反向遍歷,在需要執(zhí)行反向遍歷的時候for循環(huán)往往更方便。

NSEnumerator遍歷

NSEnumerator是個抽象基類,其中只定義了兩個方法,供其具體子類來實現(xiàn):請?zhí)砑訄D片描述
關(guān)鍵的是其中的nextObject對象,它返回枚舉里的下個對象,當返回不為nil的時候就會一直調(diào)用下一個對象,常用while語句

  • 數(shù)組
    • NSEnumerator類還提供了反向枚舉器
- (void)NSEnumerator {// ArrayNSArray *testArray = @[@"kd", @"lbj", @"Curry", @"KW", @"@PG"];NSEnumerator *enumerator = [testArray objectEnumerator];// 正向id object;while ((object = [enumerator nextObject]) != nil) {// 操作數(shù)組}// 反向NSEnumerator *reverseEnum = [testArray reverseObjectEnumerator];id object2;while ((object2 = [reverseEnum nextObject]) != nil) {// 操作數(shù)組}
  • 字典和集合
// Dict And SetNSDictionary *textDic = @{@"LA": @"LBJ", @"PHX" :@"KD"};NSEnumerator *enumertorDic = [textDic keyEnumerator];id key;while ((key = [enumertorDic nextObject]) != nil) {// 操作字典id value = textDic[key];}
}

快速遍歷

快速遍歷是OC2.0引入的語法功能,引入了in關(guān)鍵字,語法更加簡潔了collection的遍歷過程。尤其是字典類

- (void)fast {NSArray *testArray = @[@"kd", @"lbj", @"Curry", @"KW", @"@PG"];for (id object in testArray) {//}NSDictionary *textDic = @{@"LA": @"LBJ", @"PHX" :@"KD"};for (id key in textDic) {NSLog(@"%@", textDic[key]);}
}

基于塊的遍歷方式

對于塊的引入,數(shù)組字典和集合都有自己的塊遍歷方法

  • 數(shù)組
    請?zhí)砑訄D片描述
    • 參數(shù)1是每次枚舉的對象, idx是下標, stop則是代表是否停止遍歷
    • obj = array[idx];
- (void)block {NSArray *testArray = @[@"kd", @"lbj", @"Curry", @"KW", @"@PG"];__block NSInteger x = 2;[testArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {if (x < 4) {x++;NSLog(@"%@", obj);// 等效NSLog(@"%@", testArray[idx]);*stop = NO;} else {*stop = YES;NSLog(@"x == 4 STOP");}}];//
}

請?zhí)砑訄D片描述
字典和集合是一樣的思路。
遍歷時可以直接從塊里獲取更多信息,并且它能夠修改塊的方法簽名,以免進行類型轉(zhuǎn)換操作。
塊的遍歷也有反向遍歷數(shù)組字典集合,我們需要傳入一個新的選項掩碼請?zhí)砑訄D片描述
我知道反向遍歷是通過NSEnumerationReserve來實現(xiàn)的,當然反向遍歷只針對有序的數(shù)組和集合

要點

  • 遍歷collection有四種方式。最基本的辦法是for循環(huán),其次是NSEnumerator遍歷法及快速遍歷法,最新、最先進的方式則是“塊枚舉法”。
  • “塊枚舉法”本身就能通過GCD來并發(fā)執(zhí)行遍歷操作,無須另行編寫代碼。而采用其他遍歷方式則無法輕易實現(xiàn)這一點。
  • 若提前知道待遍歷的collection含有何種對象,則應修改塊簽名,指出對象的具體類型。

49.對自定義其內(nèi)存管理語義的collection使用無縫橋接

“無縫橋接”技術(shù)其實就是不同庫之間相同類型的相互轉(zhuǎn)換。
使用“無縫橋接”技術(shù),可以在定義于Foundation框架中的OC類和定義于CoreFoundation框架中的C數(shù)據(jù)結(jié)構(gòu)之間互相轉(zhuǎn)換

- (void)seamlessBridging {NSArray *testArray = @[@"kd", @"lbj", @"Curry", @"KW", @"@PG"];CFArrayRef aCFArray = (__bridge  CFArrayRef)testArray;NSLog(@"cfArratSize =  %li", CFArrayGetCount(aCFArray));
}

轉(zhuǎn)換操作中的__bridge告訴ARC如何處理轉(zhuǎn)換所涉及的OC對象。__bridge本身的意思是:ARC仍然具備這個OC對象的所有權(quán)。而__bridge_retained則與之相反,意味著ARC將交出對象的所有權(quán)。與之相似,反向轉(zhuǎn)換可通過__bridge_transfer來實現(xiàn),也就是將對象的所有權(quán)交給ARC。這三種轉(zhuǎn)換方式稱為“橋式轉(zhuǎn)換”

要點

  • 通過無縫橋接技術(shù),可以在Foundation框架中的OC對象與CoreFoundation框架中的C語言數(shù)據(jù)結(jié)構(gòu)之間來回轉(zhuǎn)換。
  • 在CoreFoundation層面創(chuàng)建collection時,可以指定許多回調(diào)函數(shù),這些函數(shù)表示此collection應如何處理其元素。然后,可運用無縫橋接技術(shù),將其轉(zhuǎn)換成具備特殊內(nèi)存管理語義的OC collection。

50.構(gòu)建緩存時選用NSCache而非NSDictionary

就目前的知識而言,對于從網(wǎng)上下載的圖片如何緩存,我會把圖片全部放到字典里,使用的時候就無需再次下載了,OC提供了一個NSCache類更好的方便緩存。

NSCache

NSCache類的優(yōu)勢在于當系統(tǒng)資源即將耗盡的時候自動刪減緩存,這是字典類不能做到的。并且遵循先刪減最久未使用的對象

NSCache并非拷貝 鍵 而是保留 鍵。這和字典完全不同,并且NSCache是線程安全的,它在開發(fā)者不自己編寫安全鎖的情況下多個線程可以同時訪問NSCache,這對于緩存來說是很重要的,多線程完成這個任務更加方便

NSCache可以令開發(fā)者操控緩存刪減其內(nèi)容的時機,可以調(diào)整緩存里的對象總數(shù)和對象的總開銷,就是在講對象加入緩存的時候開發(fā)者可以知道開銷值,對象總數(shù)或總開銷超過上限,緩存就會自動刪減不需要的對象,當然這個刪減不能確定會不會刪減掉某個必要的對象,所以把對象轉(zhuǎn)換成NSData對象之后把數(shù)據(jù)大小當作緩存值更合適這樣避免了復雜的計算開銷值,變成了讀取數(shù)據(jù)大小的步驟

NSCache實例

書上提供了實用NSCache的例子,并引入其他的知識。
請?zhí)砑訄D片描述
請?zhí)砑訄D片描述
下載數(shù)據(jù)所用的URL,就是緩存的鍵。若緩存未命中,即緩存中沒有訪問者所需的數(shù)據(jù),則下載數(shù)據(jù)并將其放入緩存。而數(shù)據(jù)的“開銷值”則設為其長度

存在一個類叫做NSPurgeableDataNSCache搭配起來用,它是NSMutableData的子類,而且實現(xiàn)了NSDiscardableContent協(xié)議。如果某個對象所占的內(nèi)存能夠根據(jù)需要隨時丟棄,那么就可以實現(xiàn)該協(xié)議所定義的接口。這就是說,當系統(tǒng)資源緊張時,可以把保存NSPurgeableData對象的那塊內(nèi)存釋放掉。NSDiscardableContent協(xié)議里定義了名為isContentDiscarded的方法,用來查詢相關(guān)內(nèi)存是否釋放。

如果需要訪問某個NSPurgeableData對象,可以調(diào)用其beginContentAccess方法,告訴它現(xiàn)在還不應丟棄自己所占據(jù)的內(nèi)存。用完之后,調(diào)用endContentAccess方法,告訴它在必要時可以丟棄自己所占據(jù)的內(nèi)存了。這些調(diào)用可以嵌套,類似于對象的引用計數(shù)機制,為0就告訴系統(tǒng)可以銷毀對象了

將NSPurgeableData對象加入NSCache,那么當該對象為系統(tǒng)所丟棄時,也會自動從緩存中清除。通過NSCache的evictsObjectsWithDiscardedContent屬性,選擇開啟或者關(guān)閉此功能。

要點

  • 實現(xiàn)緩存時應選用NSCache而非NSDictionary對象。因為NSCache可以提供優(yōu)雅的自動刪減功能,而且是“線程安全的”,此外,它與字典不同,并不會拷貝鍵。
  • 可以給NSCache對象設置上限,用以限制緩存中的對象總個數(shù)及“總成本”,而這些尺度則定義了緩存刪減其中對象的時機。但是絕對不要把這些尺度當成可靠的“硬限制”,它們僅對NSCache起指導作用。
  • NSPurgeableData與NSCache搭配使用,可實現(xiàn)自動清除數(shù)據(jù)的功能,也就是說,當NSPurgeableData對象所內(nèi)存為系統(tǒng)所丟棄時,該對象自身也會從緩存中移除。
  • 如果緩存使用得當,那么應用程序的響應速度就能提高。只有那種“重新計算起來很費事的”數(shù)據(jù),才值得放入緩存,比如那些需要從網(wǎng)絡獲取或從磁盤讀取的數(shù)據(jù)。

51.精簡initialize與load的實現(xiàn)代碼

在OC里一個類必須初始化才能使用,大多數(shù)類繼承與NSObject這個根類,提供了loadinitalize方法
請?zhí)砑訄D片描述

load

加入運行期系統(tǒng)中的每個類和分類來說,會調(diào)用此方且僅調(diào)用一次,當類和分類的程序載入系統(tǒng)的時候就會執(zhí)行這個方法,調(diào)用順序是類大于分類。

load方法執(zhí)行的時候運行期系統(tǒng)處于脆弱狀態(tài),在執(zhí)行子類的load方法之前必須執(zhí)行所有超類的load方法,其中還會執(zhí)行代碼涉及到的庫的load,導致在load方法里面使用其他類不安全
請?zhí)砑訄D片描述
在B類里調(diào)用A類,無法保證A類已經(jīng)加載完成,也就是只有A的load方法執(zhí)行完成才能完整的使用A類。

某個類沒實現(xiàn)load方法,那么他的超類不論實現(xiàn)該方法,都不會調(diào)用。
load盡量不用它。

initalize

該方法是在程序首次使用該類之前調(diào)用且僅有一次,是由運行期系統(tǒng)調(diào)用的,不通過代碼調(diào)用。和load存在區(qū)別

  • 惰性調(diào)用:當程序用到了相關(guān)類的時候才會調(diào)用,類似于懶加載模式。而load是所有類不管用不用先load方法之后再說
  • 其次運行期在執(zhí)行該方法的時候是系統(tǒng)正常狀態(tài),也就是安全狀態(tài),不影響調(diào)用類的其他方法,此為線程安全。
  • 當某個類沒實現(xiàn)initialize方法,超類實現(xiàn)后會調(diào)用超類的方法,和大多數(shù)消息是一樣的。

initalize方法盡量精簡

  • 首先,大家都不想看到自己的應用程序“掛起”,若寫的太過繁瑣,導致其運行很慢那就適得其反了。
  • 開發(fā)者無法控制類的初始化時機。
  • 最后,如果某個類的實現(xiàn)代碼很復雜,那么其中可能會直接或間接用到其他類。若那些類尚未初始化,則系統(tǒng)會迫使其初始化。然而,本類的初始化方法此時尚未運行完畢。其他類在運行其initialize方法時,有可能會依賴本類中的某些數(shù)據(jù),而這些數(shù)據(jù)此時也許還未初始化好,就會造成依賴環(huán)

initalize方法只應該用來設置內(nèi)部數(shù)據(jù),不能在內(nèi)部調(diào)用其他的方法。

initalize還可以初始化某個無法在編譯器初始化的全局變量

請?zhí)砑訄D片描述
無法初始化數(shù)組等一些類,整數(shù)可以在編譯期定義。
請?zhí)砑訄D片描述
放到initalize里面即可在調(diào)用前完成該全局變量的初始化
請?zhí)砑訄D片描述

+ (void)initialize {if (self == [ViewController class]) {staticArray = [NSArray new];}
}
  • 別忘了單例類也可以實現(xiàn)該目的

要點

  • 在加載階段,如果類實現(xiàn)了load方法,那么系統(tǒng)就會調(diào)用它。分類里也可以定義此方法,類的load方法要比分類中的先調(diào)用。與其他方法不同,load方法不參與覆寫機制。
  • 首次使用某個類之前,系統(tǒng)會向其發(fā)送initialize消息。由于此方法遵從普通的覆寫規(guī)則,所以通常應該在里面判斷當前要初始化的是那個類。
  • load與initialize方法都應該實現(xiàn)的精簡一些,這有助于保持應用程序的響應能力,也能減少引入“依賴環(huán)”的幾率。
  • 無法在編譯期設定的全局常量,可以放在initialize方法里初始化。

52.別忘了NSTimer會保留其目標對象

Foundation框架中有個類叫NSTimer,開發(fā)者可以指定絕對的日期與時間,以便到時執(zhí)行任務,計時器要和“運行循環(huán)(run loop)”相關(guān)聯(lián),運行循環(huán)到時候會觸發(fā)任務。創(chuàng)建NSTimer時,可以將其“預先安排”在當前的運行循環(huán)中,也可以先創(chuàng)建好,然后由開發(fā)者自己來調(diào)度。無論采用哪種方式,只有把計時器放在運行環(huán)里,它才能正常觸發(fā)任務

創(chuàng)建計時器

 _pollTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(pDoPoll) userInfo:nil repeats:YES];

用此方法創(chuàng)建出來的計時器,會在指定的間隔時間之后執(zhí)行任務。也可以令其反復執(zhí)行任務,知道開發(fā)者稍后將其手動關(guān)閉為止。

計時器會保留其目標對象,等到自身“失效”時再釋放此對象。調(diào)用invalidate方法可令計時器失效;執(zhí)行完相關(guān)任務之后,一次性的計時器也會失效。開發(fā)者若將計時器設置成重復執(zhí)行模式,那么必須自己調(diào)用invalidate方法,才能令其停止。

由于計時器會保留其目標對象,所以反復執(zhí)行任務通常會導致應用程序出現(xiàn)保留環(huán)。

// NSTimer- (void)startPolling {_pollTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(pDoPoll) userInfo:nil repeats:YES];[self stopPolling];
}
- (void)stopPolling {[_pollTimer invalidate];_pollTimer = nil;
}
- (void)pDoPoll {NSLog(@"poll");
}
// 為啥不實現(xiàn)dealloc?
- (void)dealloc {[_pollTimer invalidate];
}

這里為什么一直打印poll不是很理解 為什么沒有調(diào)用dealloc方法
請?zhí)砑訄D片描述

保留環(huán)

創(chuàng)建計時器的時候,由于目標對象是self,所以要保留此實例。然而,因為計時器是用實例變量存放的,所以實例也保留了計時器,于是,就產(chǎn)生了保留環(huán)。所以說,調(diào)用stopPolling,或者令系統(tǒng)將此實例回收,只有這樣才能打破保留環(huán)。

因為是類和這個類中的實例出現(xiàn)了保留環(huán),不管你外界怎么對這個類釋放,這個計時器始終都會保留這個類,而這個類也會保留這個計時器,互相引用保留導致他們的計數(shù)永遠都不會降為0請?zhí)砑訄D片描述
如果從外界直接先調(diào)用stop方法,代碼沒辦法自己檢測。

使用塊的特點打破保留環(huán)

使用塊和weak關(guān)鍵字合理的打破保留環(huán),塊可以傳遞代碼,這一功能可以利用
請?zhí)砑訄D片描述

這段代碼將計時器所應執(zhí)行的任務封裝成“塊”,在調(diào)用計時器函數(shù)上,把它作為userInfo參數(shù)傳進去。該參數(shù)可用來存放“不透明值”(即萬能值),只要計時器還有效,就會一直保留著它。傳入?yún)?shù)時要通過copy方法將block拷貝到“堆”上(之前在blk提過,copy方法把塊變成了有引用計數(shù)的對象。)

否則等到稍后要執(zhí)行它的時候,該塊可能已經(jīng)無效了。計時器現(xiàn)在的target是NSTimer類對象,這是個單例,因此計時器是否會保留它,其實都無所謂。此處依然有保留環(huán),使用
方法和weak關(guān)鍵字打破它請?zhí)砑訄D片描述

[NSTimer scheduledTimerWithTimeInterval:2 repeats:YES block:^

請?zhí)砑訄D片描述
這段代碼采用了一種很有效的寫法,他先定義了一個弱引用,令其指向self,然后使塊捕獲這個引用,而不直接去捕獲普通的self變量。也就是說,self不會為計時器所保留。當塊開始執(zhí)行時,立刻生成strong引用,以保證實例在執(zhí)行期間持續(xù)存活。

要點

  • NSTimer對象會保留其目標,直到計時器本身失效為止,調(diào)用invalidate方法可令計時器失效,另外,一次性的計時器在觸發(fā)完成任務之后也會失效。
  • 反復執(zhí)行任務的計時器,很容易引人保留環(huán),如果這種計時器的目標對象又保留了計時器本身,那肯定會導致保留環(huán)。這種環(huán)狀保留關(guān)系,可能是直接發(fā)生的,也可能是通過對象圖里的其他對象間接發(fā)生的。
  • 可以擴充NSTimer的功能,**用“塊” 來打破保留環(huán)。**不過,除非NSTimer將來在公共接口里提供此功能,否則必須創(chuàng)建分類,將相關(guān)實現(xiàn)代碼加入其中。

總結(jié)

小藍書的最后一章剛開始看的不是很理解,有些代碼還是需要自己手動打一下才知道原理,其中49.50 就是看著書寫的,理解的不是很完全,GCD和block還是需要再次多加學習才能掌握。

http://m.aloenet.com.cn/news/42634.html

相關(guān)文章:

  • 創(chuàng)建網(wǎng)站的準備網(wǎng)頁鏈接
  • wordpress css代碼背景色如何優(yōu)化標題關(guān)鍵詞
  • 用java做電商網(wǎng)站廈門百度代理
  • 新余網(wǎng)站建設外鏈發(fā)布的平臺最好是
  • 怎么免費自己做網(wǎng)站精準信息300099
  • 去年做哪個網(wǎng)站能致富競價培訓課程
  • 做網(wǎng)站九州科技sem優(yōu)化托管
  • excel做郵箱網(wǎng)站怎么加3www河南網(wǎng)站推廣那家好
  • 長春火車站什么時候通車湖南網(wǎng)站優(yōu)化
  • 廣州市做企業(yè)網(wǎng)站東莞seo培訓
  • 長春網(wǎng)站開發(fā)senluowx免費網(wǎng)站站長查詢
  • 免費網(wǎng)站推廣服務軟文代理平臺
  • 石景山區(qū)城鄉(xiāng)建設委員會網(wǎng)站百度推廣入口官網(wǎng)
  • 長沙網(wǎng)站設計制作seo網(wǎng)站推廣專員招聘
  • 想開個網(wǎng)站不知怎樣做北京疫情最新消息情況
  • 仿58網(wǎng)站怎么做網(wǎng)站出售
  • 深圳網(wǎng)站建站建設新聞頭條新聞
  • wordpress使用培訓seo公司彼億營銷
  • 網(wǎng)站空間租用有哪些服務seo搜索排名影響因素主要有
  • 范縣網(wǎng)站建設公司精準營銷通俗來說是什么
  • vue可以做pc端網(wǎng)站嗎河南網(wǎng)站推廣
  • 旅游景區(qū)網(wǎng)站建設谷歌搜索指數(shù)查詢
  • 印刷網(wǎng)絡商城網(wǎng)站建設推廣新產(chǎn)品最好的方法
  • 信陽專業(yè)做網(wǎng)站公司客戶管理軟件
  • 網(wǎng)站制作軟件手機百度優(yōu)化軟件
  • 自己在家開網(wǎng)站做推廣百度優(yōu)化關(guān)鍵詞
  • 網(wǎng)站推介方案谷歌官方網(wǎng)站登錄入口
  • 單位網(wǎng)站開發(fā)合同泉州網(wǎng)站seo外包公司
  • 建設家具網(wǎng)站的目的及功能定位北京網(wǎng)絡營銷策劃公司
  • 選擇網(wǎng)站的關(guān)鍵詞cpu優(yōu)化軟件