一周隨筆--15.9.21,隨筆--15.9.21
一周新知識點記錄(15.9.21)一. writeToFile:atomically:
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
第二個參數的意思是:
如果為YES則保證檔案的寫入原子性,就是說會先建立一個臨時檔案,直到檔案內容寫入成功再匯入到目標檔案裡.
如果為NO,則直接寫入目標檔案裡.
二.
NSerror
參數依次為:
1、錯誤域(NSString)
2、錯誤標識 (NSInteger)
3、錯誤資訊 (字典)
NSError *error = [NSError errorWithDomain:@"錯誤域" code:400 userInfo:@{NSLocalizedDescriptionKey:@"錯誤資訊"}];
NSLog(@"%@",error.localizedDescription);
NSLog(@"%@",error.description);
注意:error.description並不是錯誤資訊,NSError沒有description這個屬性來描述錯誤資訊,這是對error對象的描述
參考
三. ios7
的
self.view.frame
ios7.0以後如果導覽列translucent為YES,即半透明,那麼self.view的始終是以螢幕左上方為座標(0,0)點的。
如果導覽列translucent為NO,即不透明。那麼self.view在載入完畢之後,即視圖控制器的viewDidLoad方法之後(注意是之後,不包括viewDidLoad),它的地區不包括導覽列部分,即以導覽列左下角點為座標(0,0)點,高度也是螢幕高度減去了導覽列高度和狀態列高度。
特別注意在self.view載入未載入完畢,即self.view顯示之前(viewWillAppear之前),它還是以螢幕左上方為座標(0,0)點的。
四. 關於在非同步函數中執行主隊列中的任務
dispatch_async(dispatch_get_main_queue(), ^{
[self initBaseView];
});
程式碼範例如上
在主隊列中新增工作,並通過非同步函數執行。因為主隊列中的任務只能在主線程中執行,因此不開闢新的線程,那麼該任務在主線程中是串列執行的。這樣的話上面代碼直接替換成 [self initBaseView];有什麼區別呢?
區別在於:加入viewDidLoad:方法裡有3段代碼,按順序從上到下依次為A B C。其中B為[self initBaseView];
運行之後,發現3段代碼的運行順序為A,B,C,沒有任何問題。但是如果將B替換成在用非同步函數從主隊列中執行,那麼執行的順序將會是A,C,B。
因為上面的代碼是在主隊列中加入了待執行的程式碼片段B(任務B),非同步函數會等待主線程中在任務B之前的任務(也就是任務B所在的viewDidLoad:函數)執行完畢才會將任務B從主隊列中取出,放在主線程中執行。這就是為什麼先執行A,C。再執行B的原因。因此,viewDidLoad方法執行完畢,才會去執行B。
五. 關於圖形上下文建立方法的參數Scale
關於建立圖形內容相關的兩個方法
方法一:UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale);
方法二:UIGraphicsBeginImageContext(CGSize size);
方法一中3個參數依次表示:
size:建立的圖形內容相關的尺寸大小
opaque:圖形上下文是否透明 NO為不透明
scale:映像縮放比例(用於調整映像解析度)。
在理解之前首先要知道的是,對於手機螢幕而言,我們用解析度在衡量螢幕的清晰度。解析度的單位是像素,以iphone6為例,解析度為750*1336像素。而我們所說的螢幕的尺寸,對於iphone6而言則是375*668,單位是點。因此iphone6螢幕一個點包含4個像素(2*2)。這個2就對應螢幕的scale屬性,可以通過[UIScreen mainScreen].scale來擷取。
理解了上面內容,方法中的scale就不難理解了。這個scale是擷取到的映像的縮放比例(或者說是縮放因子),它決定了擷取到的映像的解析度。簡單理解,假如scale的值為2,那麼擷取到的映像一個點有4個像素(長寬各2個)。通常我們把scale的值設定成0,表示設定成預設的縮放比例(跟螢幕相同),對於配備了兩倍retain屏的iphone4s、5、5s、6,這個縮放比例預設就是2;如果是6p,則預設是3,因此scale設定成0或設定成2對於iphone4s、5、5s、6是一樣的。
對於方法二而言,並沒有scale這個參數,其實它的預設值為1,並不是0。因此用這個方法建立圖形上下文得到的映像品質會比較低(除非iphone4)。映像的品質從映像的大小就能區別出來,將擷取到的映像儲存到沙箱,查看映像大小,輕鬆辨別。
六. ios7.0截屏新方法
- (BOOL)drawViewHierarchyInRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates
該方法對指定UIView作用,通過將UIView的內容繪製到圖形上下文上然後擷取映像來達到截取UIView的效果。
作用對象:要截取的UIView對象
參數說明:
rect:圖形上下文上的地區,不是UIView的地區。將UIView繪製到圖形上下文rect的地區上。
afterUpdates:尚不清楚。推測設定成NO立即截取
七. 先行編譯輸出宏定義
#ifdef DEBUG#define DebugLog(format,…) NSLog(@"{%s,%d}" format, __FUNCTION__,__LINE__,##__VA_ARGS__)#else#define DebugLog(format,…)#endif
系統宏介紹:
__LINE__:宏在先行編譯時會替換成當前的行號
__FUNCTION__:宏在先行編譯時會替換成當前的函數名稱
__VA_ARGS__:簡單的說,就是將左邊…的內容替換進來
##:宏串連符
參考
八. 運算子
&:按位與
|:按位或
^:按位亦或
~:取反
>>:右移
參考
九. 應用打包成ipa
1.先將運行模式設定為真機
2.Xcode上面菜單——Product——Archive
3.右擊工程,在finder中開啟
4.右擊——顯示包內容——Products——Applications 看到一個有禁止符號的檔案
5.開啟Itunes,將該拖進去,這樣就能在Itunes的應用程式一欄找到打包好的ipa檔案了。