ios 小技巧整理 不定時更新
1. 製作靜態庫時,真機和模擬器的庫檔案是不一樣的,因此要合併起來。
lipo -create ../Release-iphonesimulator/*.a ../Release-iphoneos/libPrint.a
-output ../libPrint.a
2. NSlog只在debug狀態下打出,在release狀態下就無視掉。提高產品的效能。
先介紹幾個常用的巨集:
- __VA_ARGS__ 是一個可變引數的巨集,這個可變引數的巨集是新的C99規範中新增的,目前似乎只有gcc支援(VC6.0的編譯器不支援)。巨集前面加上##的作用在於,當可變引數的個數為0時,這裡的##起到把前面多餘的","去掉,否則會編譯出錯。
- __FILE__ 巨集在預編譯時會替換成當前的原始檔名
- __LINE__巨集在預編譯時會替換成當前的行號
- __FUNCTION__巨集在預編譯時會替換成當前的函式名稱
- __OPTIMIZE__ 是release 預設會加的巨集
#ifndef __OPTIMIZE__ #define MyLOG(...) NSLog(__VA_ARGS__) #define MyPrintBaseLog NSLog(@"%s(%d)", __FUNCTION__, __LINE__) #define MyDebugLog(s, ...) NSLog(@"%s(%d): %@", __FUNCTION__, __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__]) #else #define MyLOG(...) #define MyPrintBaseLog #define MyDebugLog(s, ...) #endif
更改debug和release狀態:
Edit Scheme -> Run project -> Build Configuration
3. ARC的問題
- 1.在targets->build phases中修改compiler Flags屬性,新增:-fobjc-arc,就可以讓舊的工程支援arc;
- 2.在targets->build phases中修改compiler Flags屬性,新增:-fno-objc-arc,就可以讓原來支援arc的工程不使用arc,對於大部分第三方類庫來說都可以順利編譯通過
4. 呼叫系統的工具
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://10086"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://10086"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto:// [email protected]"]];
補充:呼叫自己的app。
在如下URL Schemes 新增自定義的Scheme。然後就可以在Safari中輸入"begin://",啟動你的app了。當然後面也可以跟引數,例如:begin://test/path?p=1&q=2....
處理方法是
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url; // Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation NS_AVAILABLE_IOS(4_2); // no equiv. notification. return NO if the application can't open for some reason
保險起見,兩個方法最好都重寫一下。
5. 延時函式:
[NSThread sleepForTimeInterval:3];
[self performSelector:@selector(machineBallAction) withObject:nil afterDelay:0];
6.記錄程式執行的時間。
clock_t begin = clock();
// do somethingclock_t end = clock();NSLog(@"used time:%f s",(end - begin)/(float)CLOCKS_PER_SEC);
7. 在適配不同版本的系統時,有一些方法在新版本里已經被代替了,但是舊版本又不支援新版本的方法,所以特殊情況下,要對系統版本進行判斷,然後分別實現兩種不同的方法,這樣在xcode裡面就會出現如下警告,作為優美程式碼的coder,當然不想看到折麼刺眼的東西。
下面給出一種方法來消除這樣的警告。
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
//deprecated methods.
#pragma GCC diagnostic pop
同樣在“performSelector:withObject”的時候,如果selector是動態變化的,那麼也有警告,可以用類似的方法來消除
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[self performSelector:oneSelector withObject:object];
#pragma clang diagnostic pop
8. 快速清空subViews
[self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
9. trim掉string的空格
aString = [aString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
10. 新增自定義字型
首先將*.ttf檔案新增到工程中,然後在info.plist檔案中新增一個key, key的名字是Fonts provided by application,預設是array,然後將新增的字型檔名字寫到後面就行了。
在工程用的時候可以直接
[UIFont fontWithName:@"******" size:20.0];
如果名字不知道的話可以遍歷一下。
11. NSLOG
NSLog函式支援printf函式所有的格式和控制符號。而且它還可以支援%@來列印一個物件。當使用%@時,給物件傳送description訊息,description方法返回一個字串來代替%@。
符號 顯示
%@ id
%d,%D,%i long
%u,%U unsigned long
%hi short
%hu unsigned short
%qi long long
%qu unsigned long long
%x,%X 16進位制列印unsigned long
%o,%O 8進位制列印 unsigned long
%f,%e,%E,%g,%G double
%c unsigned char-ASCII 字元
%C unichar-Unicode 字元
%s char* (以空字元結束的ASCII字元組成的字串)
%S unichar* (以空字元結束的Unicode字元組成的字串)
%p void* (以0x開頭的16進位制的地址空間)
%% A%字元
不定時更新
部分內容來源於網上,不能一一列出出處,請恕罪。