iOS 簡(jiǎn)談優(yōu)化(一)

最近發(fā)現(xiàn)應(yīng)用有卡頓現(xiàn)象眯分,后來(lái)仔細(xì)查找荤胁,發(fā)現(xiàn)有幾個(gè)地方是挺耗內(nèi)存的。

1.應(yīng)用中使用了地圖艺谆,頁(yè)面返回的時(shí)候榨惰,地圖緩存沒有清理

2.網(wǎng)絡(luò)請(qǐng)求,頁(yè)面返回的時(shí)候沒有終止網(wǎng)絡(luò)加載任務(wù)

3.加載的h5頁(yè)面静汤,沒有進(jìn)行緩存琅催,著實(shí)體驗(yàn)不佳,每次都要加載

4.dealloc方法虫给,為什么沒有執(zhí)行藤抡?

5.app中怎樣減少loading,達(dá)到更順暢的體驗(yàn)

針對(duì)以上問題狰右,進(jìn)行了一系列的檢索杰捂,實(shí)驗(yàn),不過慶幸的是棋蚌,差不多一天的時(shí)間嫁佳,把這些問題都解決了,現(xiàn)做一下整理谷暮。


解決問題1.應(yīng)用中使用了地圖蒿往,頁(yè)面返回的時(shí)候,地圖緩存沒有清理

應(yīng)用中使用了地圖湿弦,頁(yè)面返回的時(shí)候瓤漏,地圖緩存沒有清理,項(xiàng)目中集成了蘋果地圖颊埃,發(fā)現(xiàn)每次打開地圖界面蔬充,內(nèi)存都會(huì)上升幾十M,并且一直上升不降班利,直到卡死饥漫,造成這一結(jié)果的根本原因是地圖的mapView沒有釋放,導(dǎo)致每次打開地圖界面的時(shí)候內(nèi)存中都重新加載了一個(gè)地圖mapView罗标。于是在網(wǎng)上搜索了一番找到了解決辦法庸队,只需要在地圖的ViewController中dealloc方法中釋放掉mapView积蜻,將mapView設(shè)置成nil就行了。詳見博客地址:http://blog.csdn.net/isalvador/article/details/51082860彻消,具體代碼如下:

//并且在界面將要顯示的時(shí)候設(shè)置代理竿拆,將要消失的時(shí)候取消代理
- (void)viewWillAppear:(BOOL)animated {
    _mapView.delegate = self;
}

- (void)viewWillDisappear:(BOOL)animated {
    _mapView.delegate = nil;
}

- (void)dealloc{
    if (_mapView) {
        _mapView = nil;
    }
}

備注:如果沒有調(diào)用dealloc方法,請(qǐng)查看問題4的解決方法

解決問題2.網(wǎng)絡(luò)請(qǐng)求宾尚,頁(yè)面返回的時(shí)候沒有終止網(wǎng)絡(luò)加載任務(wù)

根據(jù)簡(jiǎn)書上的文章iOS取消界面的網(wǎng)絡(luò)請(qǐng)求得到的答案:要取消網(wǎng)絡(luò)請(qǐng)求,就需要一個(gè)類NSURLSessionDataTask的對(duì)象方法-cancel丙笋,有時(shí)候一個(gè)頁(yè)面可能有多個(gè)請(qǐng)求,這個(gè)時(shí)候怎么辦呢央勒?對(duì)不见,可以將每個(gè)task放在數(shù)組里澳化,然后在頁(yè)面退出調(diào)用dealloc方法時(shí)崔步,遍歷一下這個(gè)數(shù)組,判斷如果有正在執(zhí)行中的任務(wù)取消掉就可以了缎谷。就是這么簡(jiǎn)單井濒!

// 將請(qǐng)求任務(wù)添加到數(shù)組中,以post方式為例列林,get方式相同
        NSURLSessionDataTask *urlTask = [self.httpSessionManager POST:URLString parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {

        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            DebugLog(@"====請(qǐng)求成功獲取到的數(shù)據(jù)====%@",responseObject);

        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            DebugLog(@"error ==>%@",error)瑞你;
        }];
        
        [self.urlTaskArray addObject:urlTask];

// 然后在這里遍歷數(shù)組,取消掉正在執(zhí)行的任務(wù)
- (void)dealloc{

    if (self.urlTaskArray.count) {
        
        for (NSURLSessionDataTask *urlTask in self.urlTaskArray) {
            
            if (urlTask.state == NSURLSessionTaskStateRunning) {
                
                [urlTask cancel];
            }
        }
    }
}

解決問題3.加載的h5頁(yè)面希痴,沒有進(jìn)行緩存者甲,著實(shí)體驗(yàn)不佳,每次都要加載

思路是第一次加載之后進(jìn)行緩存砌创,下次直接從緩存中獲取虏缸,不用再次加載,詳見我的另一篇文章
iOS 緩存之(WebView)網(wǎng)頁(yè)緩存

解決問題4.dealloc方法嫩实,為什么沒有執(zhí)行刽辙?

根本原因是當(dāng)前的控制器的引用計(jì)數(shù)不為1,就是說(shuō)可能存在沒有被釋放的情況甲献,造成了循環(huán)引用宰缤。
可能有這幾種情況:
1>代理屬性是否使用assign進(jìn)行修飾,而不是weak晃洒,assign比weak少了一個(gè)功能慨灭,對(duì)象不用時(shí)不能自動(dòng)設(shè)置成nil。
2>block中是否使self球及,而不是__weak typeof(self) weakSelf = self; 中的weakSelf氧骤,造成了相互持有,都不能釋放掉桶略。
3>遵守的協(xié)議有沒有設(shè)置能nil语淘。

- (void)viewWillAppear:(BOOL)animated {
    _mapView.delegate = self;
}

- (void)viewWillDisappear:(BOOL)animated {
    _mapView.delegate = nil;
}

經(jīng)過鄙人的測(cè)試诲宇,一般就是這幾個(gè)問題造成的,如果還是沒有執(zhí)行dealloc方法惶翻,請(qǐng)反復(fù)進(jìn)行核實(shí)以上步驟姑蓝。

解決5.app中怎樣減少loading,達(dá)到更順暢的體驗(yàn)

情形1>app中有兩個(gè)詳情頁(yè)面需要先加載圖片吕粗,然后在顯示其他內(nèi)容纺荧,而且圖片也是要加載原圖,因?yàn)閳D片質(zhì)量較高颅筋,所以添加了loading宙暇,是的使用了SDWebImage進(jìn)行緩存,但是每次都顯示loading體驗(yàn)不太好议泵。解決方法占贫,每次顯示loaidng前,先進(jìn)行判斷如果有緩存先口,將不顯示loading直接從緩存中取得圖片型奥。獲取SDWebImage緩存的方法

        // 因?yàn)檫@個(gè)方法在子線程(全局隊(duì)列)中執(zhí)行,所以不需要考慮死線程的問題
        SDWebImageManager *manager = [SDWebImageManager sharedManager];
        [manager diskImageExistsForURL:pathUrl]; // pathUrl 是你要加載圖片的url

        if ([manager diskImageExistsForURL:pathUrl]) {
            
            UIImage *image = [[manager imageCache] imageFromDiskCacheForKey:pathUrl.absoluteString];
            
            [self loadSquarePhotoWithImage:image];
            
        }else{
            
            [SVProgressHUD show];
            
            UIImageView *tappedImageView = [[UIImageView alloc]init];
            
            __weak typeof(self) weakSelf = self;
            [tappedImageView sd_setImageWithURL:pathUrl placeholderImage:nil options:SDWebImageProgressiveDownload completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
                
                tappedImageView.image = image;
                [weakSelf loadSquarePhotoWithImage:image];
                
                [SVProgressHUD dismiss];
            }];
        }

情形2>每次加載h5的時(shí)候,考慮到網(wǎng)絡(luò)情況不穩(wěn)定碉京,網(wǎng)速慢的情況厢汹,添加了loading,但是每次打開都要顯示loading谐宙,都要加載一次烫葬,體驗(yàn)不好。
思路是第一次加載顯示loading凡蜻,加載完成之后進(jìn)行緩存搭综,下次直接從緩存中獲取,不用再次加載咽瓷,也不用在顯示loading了设凹,詳見我的另一篇文章
iOS 緩存之(WebView)網(wǎng)頁(yè)緩存

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茅姜,隨后出現(xiàn)的幾起案子闪朱,更是在濱河造成了極大的恐慌,老刑警劉巖钻洒,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奋姿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡素标,警方通過查閱死者的電腦和手機(jī)称诗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)头遭,“玉大人寓免,你說(shuō)我怎么就攤上這事癣诱。” “怎么了袜香?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵撕予,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我蜈首,道長(zhǎng)实抡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任欢策,我火速辦了婚禮吆寨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踩寇。我一直安慰自己啄清,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布姑荷。 她就那樣靜靜地躺著盒延,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鼠冕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天胯盯,我揣著相機(jī)與錄音懈费,去河邊找鬼。 笑死博脑,一個(gè)胖子當(dāng)著我的面吹牛憎乙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叉趣,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼泞边,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了疗杉?” 一聲冷哼從身側(cè)響起阵谚,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烟具,沒想到半個(gè)月后梢什,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朝聋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嗡午,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冀痕。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荔睹,死狀恐怖狸演,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情僻他,我是刑警寧澤严沥,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站中姜,受9級(jí)特大地震影響消玄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丢胚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一翩瓜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧携龟,春花似錦兔跌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蕊蝗,卻和暖如春仅乓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蓬戚。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工夸楣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人子漩。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓豫喧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親幢泼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子紧显,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,154評(píng)論 25 707
  • 愛就是,深深的理解和接納缕棵。 相比開始一段感情而言孵班, 維持或者說(shuō)經(jīng)營(yíng)一段長(zhǎng)久高質(zhì)量的感情很難得。
    棘陽(yáng)閱讀 127評(píng)論 0 1
  • 下沙.濕冷. 來(lái)到下沙的第一個(gè)晚上挥吵,在這棟小小的公寓里遇到了志同道合的“路友” 有同樣的目標(biāo) 有同樣的想法 有同樣...
    YYXXYY閱讀 111評(píng)論 2 0
  • 有一條小河流從遙遠(yuǎn)的高山上流下來(lái)重父,經(jīng)過了很多個(gè)村莊與森林,最后它來(lái)到了一個(gè)沙漠忽匈。 它想:「我已經(jīng)越過了重重的障礙房午,...
    追夢(mèng)人船長(zhǎng)閱讀 199評(píng)論 0 0
  • 1、與婚慶公司協(xié)商事宜:婚禮主色調(diào)丹允、基本流程郭厌、游戲環(huán)節(jié)等袋倔; 2、向婚慶要化妝師微信折柠,發(fā)禮服商議妝容宾娜; 3、電話一號(hào)...
    蛇鬼閱讀 122評(píng)論 0 0