iOS 開發(fā)小貼士

開發(fā)過程中或多或少會碰見一些問題和紀要,感覺有必要記下來,避免下次再犯,此文章后續(xù)會更新...

  1. iOS app通過itunes共享文件
    在程序的配置文件中添加Application supports iTunes file sharing,設置為YES;這里共享的是沙河的Document目錄

  2. DZNEmptyDataSet使用心得
    同mj刷新一起使用的時候,一定要先endrefresh方法,然后再去刷新tableview,因為DZNEmptyDataSet是在reload數(shù)據(jù)的時候獲取tableview的偏移和bounds,然后去設置空視圖的位置的,如果先reload,則會導致空視圖空視圖顯示出來的時候往上偏了54像素,54從哪里冒出來的呢?全局搜了一下,發(fā)現(xiàn)mj刷新正在pulling的時候正好54。

  3. 個人認為開發(fā)中涉及到系統(tǒng)權(quán)限的應該統(tǒng)一放在一起,放在一個文件中。

  4. CocoaLumberjack 自定義logger輸出樣式

    1. 首先自定義一個類似DDLogFileFormatterDefault的formatter作為格式輸出,實例化一個fomatter;
    2. 自定義一個ddloger,繼承于DDAbstractDatabaseLogger,重載db_log、db_save,添加post服務器方法;將第一步創(chuàng)建的formatter賦值給ddloger的formatter屬性;
    3. nslog打印

    注意:
    DDLog:基礎(chǔ)類,必須引入的。
    DDASLLogger:支持將調(diào)試語句寫入到蘋果的日志中。一般正對Mac開發(fā)。可選。
    DDTTYLogger:支持將調(diào)試語句寫入xCode控制臺。我們即使要用它。可選。
    DDFileLogger:支持將調(diào)試語句寫入到文件系統(tǒng)。可選。
    DDLog的輸出級別默認提供以下若干種:
    DDLogError:定義輸出錯誤文本
    DDLogWarn:定義輸出警告文本
    DDLogInfo:定義輸出信息文本
    DDLogDebug:定義輸出調(diào)試文本
    DDLogVerbose:定義輸出詳細文本

    提供的日志級別為:
    LOG_LEVEL_ERROR:只顯示錯誤日志。
    LOG_LEVEL_WARN:包括:LOG_LEVEL_ERROR
    LOG_LEVEL_INFO:包括:LOG_LEVEL_WARN
    LOG_LEVEL_DEBUG:包括:LOG_LEVEL_INFO
    LOG_LEVEL_VERBOSE:包括:LOG_LEVEL_DEBUG
    LOG_LEVEL_OFF:關(guān)閉日志
    level = LOG_LEVEL_VERBOSE的時候,以上所有的level的打印日志都會進行打印,在appdelegate中添加多少個logger,就會形成幾種情況的日志,譬如:文件、數(shù)據(jù)庫、控制臺等,添加自定義的之后便會增加一種日志形式(自定義的上傳給服務器的日志)
    問題:

    1. 日志文件logger只會存入error和warning的日志嗎?
    2. 日志文件只有一個嗎?如果不是,什么時候就會創(chuàng)建?
  5. category中添加成員變量
    .h

    @property (nonatomic, retain)   LBEmptyPageView * emptyView;
    @property (assign, nonatomic) BOOL  showNetError;
    
    static const void * emptyViewKey =  &emptyViewKey;
    
    @implementation BaseViewController  (EmptyDataSet)
    - (LBEmptyPageView *)emptyView {
    return objc_getAssociatedObject(self,   &emptyViewKey);
    }
    
    - (void)setEmptyView:(LBEmptyPageView *)emptyView {
      objc_setAssociatedObject(self,    emptyViewKey, emptyView,    OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (BOOL)showNetError{
       return   [objc_getAssociatedObject(self, _cmd)   boolValue];
    }
    
    - (void)setShowNetError:    (BOOL)showNetError{
    objc_setAssociatedObject(self, @selector(showNetError), @(showNetError), OBJC_ASSOCIATION_ASSIGN);
    }
    

    category使用原則:

    1. category的實現(xiàn)可以依賴主類,但主類一定不依賴category,也就是移除一個category的代碼不會對主類產(chǎn)生影響
    2. category可以直接食用主類已有的私有成員變量,但不應該為實現(xiàn)catecory而在主類中添加成員變量,考慮通過上述的方式實現(xiàn)。
  6. 在用xib自定義tableview的頭部時候,有時會出現(xiàn)當我NSbundle實例化之后改變它的frame不管用,這個可能xcode的bug或者是緩存問題,刪掉重新搞

  7. 之前碰到一個問題就是缺少庫的問題,第一次顯示缺AFNetWorking,我將AFNetWorking從cocoapods中刪除手動添加之后,它又會報其它庫的錯誤,一般這種問題就是因為路徑的問題,這里奉上解決方法:library search path 設置:$(inherited)

  8. iOS7報錯信息:Library not loaded: /System/Library/Frameworks/Photos.framework/Photos
    Referenced from: /var/mobile/Applications/E19A46C1-C0EC-4DC3-A9CE-DC84811DD7E8/xxxx.app
    Reason: image not found
    解決方案:You need to weak link Photos.framework, not ALAssetsLibrary! Xcode -> Targets -> YourTargetName -> Build Phases -> Link Binary With Libraries -> Set Photos.framework to Optional.

  9. 圖片裁剪:可以實現(xiàn)美食杰啟動頁圖片上下分開動畫效果

CGImageCreateWithImageInRect(image.CGImage, CGRectMake(0, image.size.height *0.5, image.size.width, image.size.height *0.5))
  1. 播放GIF比較好的庫:FlipBoard出品的FLAnimatedImage

  2. time profilter部分專詞意思
    Separate by Thread:按線程分開做分析,這樣更容易揪出那些吃資源的問題線程。特別是對于主線程,它要處理和渲染所有的接口數(shù)據(jù),一旦受到阻塞,程序必然卡頓或停止響應。
    Invert Call Tree:反向輸出調(diào)用樹。把調(diào)用層級最深的方法顯示在最上面,更容易找到最耗時的操作。
    Hide Missing Symbols:隱藏缺失符號。如果 dSYM 文件或其他系統(tǒng)架構(gòu)缺失,列表中會出現(xiàn)很多奇怪的十六進制的數(shù)值,用此選項把這些干擾元素屏蔽掉,讓列表回歸清爽。
    Hide System Libraries:隱藏系統(tǒng)庫文件。過濾掉各種系統(tǒng)調(diào)用,只顯示自己的代碼調(diào)用。
    Flattern Recursion:拼合遞歸。將同一遞歸函數(shù)產(chǎn)生的多條堆棧(因為遞歸函數(shù)會調(diào)用自己)合并為一條。
    Top Functions:找到最耗時的函數(shù)或方法。

  3. NSSortDescriptor
    通過它可以實現(xiàn)數(shù)組內(nèi)模型根據(jù)某一個字段或者多個進行排序,示例代碼如下:

//按年齡和名字排序,如果碰到年齡相等的,則根據(jù)名字排序
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"_age" ascending:NO];
NSSortDescriptor *sortDescriptorName = [[NSSortDescriptor alloc] initWithKey:@"_name" ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, sortDescriptorName, nil];
[_mutArrVideo sortUsingDescriptors:sortDescriptors];
```

  1. 獲取數(shù)字數(shù)組中的最大項和最小項

NSArray * arr = [NSArray arrayWithObjects:@"10",@"50",@"9", nil];
NSInteger max = [[arr valueForKeyPath:@"@max.intValue"] integerValue];
```

  1. 非主線程執(zhí)行UI操作檢測工具
    PSPDFUIKitMainThreadGuard.m

  2. 奇怪矩陣
    控制臺打印:

    <Error>: CGAffineTransformInvert: singular matrix.
    May 11 16:19:48  LBAssistant[4704] <Error>:     CGAffineTransformInvert: singular matrix.
    May 11 16:19:48  LBAssistant[4704] <Error>:     CGAffineTransformInvert: singular matrix.
    

    并且相機黑屏,但是拍到的照片是存在的,只是黑屏,
    bug猜測原因是:UIActionsheet的問題,更換自定義的就沒事兒了,但心里還是覺得此問題不簡單,另有他因,還待高人指點。

  3. cell計算高度卡頓
    xib布局的自定義cell第一次計算高度卡頓2s,其原因是:布局中l(wèi)able使用了第三方字體(黑體),非系統(tǒng)字體

  4. brew update 出錯:Error: /usr/local must be writable!? 解決方案:

    sudo chgrp -R admin /usr/local
    sudo chmod -R g+w /usr/local
    
  5. 關(guān)于寫入權(quán)限的問題

    sudo chown demoker /Library/Caches/Homebrew
    

    demoker 是你當前用戶名,后面的是你受權(quán)限限制的文件目錄

  6. 關(guān)于injectionforXcode 使用時碰到的問題

    1. 真機運行
      解決方法:在main.m或者.pch中添加??代碼:
      #ifdef DEBUG
          static char _inMainFilePath[] = __FILE__;
          static const char *_inIPAddresses[] = {"192.168.83.47", "127.0.0.1", 0};
          //??兩個聲明可加可不加
          #define INJECTION_ENABLED
          #import "/tmp/injectionforxcode/BundleInjection.h"
      #endif
      
    2. Could not codesign as 'iPhone Developer':/Users/...

    tip_19.png

    issue圖片中寫得很清楚了證書到底是圖中兩個證書里面的哪一個,解 決方法就是修改iOSInjectionProject/x86_64/identity.txt 文件中證書為正 確的那一個即可,這樣就可以使用這個插件了??。[參考] (https://github.com/johnno1962/injectionforxcode/issues/41)

  7. synx 同步iOS工程目錄
    Xcode下面直接創(chuàng)建Group時在本地項目文件夾中并不會形成實體文 件夾,通過synx可以將Group目錄同步。使用:

    1. 安裝
      sudo gem install synx
    2. 使用
      synx your path

CocoaPods管理的庫要重新pod install一次,手動添加的Framework也要重新添加。

  1. Realm pod install 失敗

[!] /bin/bash -c
set -e
sh build.sh cocoapods-setup

core is not a symlink. Deleting...
Downloading dependency: core 1.0.1
Downloading core failed:
curl: (56) SSLRead() return error -36
```
解決方法:
```rm -rf Pods```,刪除工程目錄下的pods文件夾,然后重新   pod install,安裝Realm的時候會慢一些,等了很長時間...解決方     法  參考鏈接[??](https://github.com/realm/realm-cocoa/   issues/2713)
    
```
curl https://static.realm.io/downloads/core/realm-core-1.0.1.tar.bz2 -O
mkdir $TMPDIR/core_bin
mv realm-core-1.0.1.tar.bz2 $TMPDIR/core_bin
22. 子類是可以調(diào)用父類xib文件進行實例化的,例如LBWebViewController
23. sublime 插件安裝方法:[鏈接](https://packagecontrol.io/installation#st3)
      1. 
```ctrl+ `
```,打開console,執(zhí)行
```simple
```中的命令,即可
      2. 安裝完
```package control.sublime-package
```,就可以安裝其他插件了
      3. 
```shift+command+p
``` 找到
```install package
```命令,回車,然后輸入需要安裝的插件名稱,再回車就可以了
24. realm pod 報錯'object_schema.hpp' file not found 
     
    ```
    1. rm -rf Pods
    2. rm -rf ~/Library/Caches/CocoaPods
    ```


Done.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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