1、[NSMutableArray array] 和 [[NSMutableArray alloc]init] (包括字典等同類) 的使用方法的區(qū)別:
alloc (內(nèi)存分配)以及init(初始化) Objective-C 協(xié)議分為非正式協(xié)議和正式協(xié)議 。
這兩個方式都是建立一個空的Array
[NSMutableArray array]不需要release,使用autoreleasepool機(jī)制。
[[NSMutableArray alloc] init]需要自己手動release
2、升級完Xcode8.0后,Command + option +/ 即可多行注釋代碼,無需引入框架,但只在方法前才起作用
3、要說 GCD 絕對是 iOS 里面最容易使用異步的一個方式了:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
});
});
4、自定義對象中添加如下方法來支持下標(biāo)取值特性:
- (id)objectAtIndexedSubscript:(NSUInteger)idx {
return container[idx];
}
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx {
container[idx] = obj;
}
5、UIWebView的大小符合HTML的內(nèi)容
- (void)webViewDidFinishLoad:(UIWebView *)webView{
CGSize size=webView.scrollView.contentSize;//iOS 5+
webView.bounds=CGRectMake(0,0,size.width,size.height);
}
6、UIWebView 能通過“捏合”手勢進(jìn)行縮放
webview=[[UIWebView alloc]init];
webview.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
webview.scalesPageToFit=YES;
webview.multipleTouchEnabled=YES;
webview.userInteractionEnabled=YES;
7、獲取UUID,作為統(tǒng)計的標(biāo)示
NSUUID *uuid = [[UIDevice currentDevice] identifierForVendor];
NSString *uuidStr = [NSString stringWithFormat:@"%@",uuid];
8、友盟收集到的崩潰以及解決辦法
Application received signal SIGABRT
(null)
((
0 CoreFoundation 0x0000000192eed1d0 <redacted> + 148
1 libobjc.A.dylib 0x000000019192455c objc_exception_throw + 56
2 CoreFoundation 0x0000000192eed100 <redacted> + 0
3 絕對潮流 0x100100dac 絕對潮流 + 1052076
4 libsystem_platform.dylib 0x0000000191f7d338 _sigtramp + 36
5 libsystem_pthread.dylib 0x0000000191f83450 pthread_kill + 112
6 libsystem_c.dylib 0x0000000191e2f400 abort + 140
7 libsystem_malloc.dylib 0x0000000191effa5c <redacted> + 0
8 libsystem_malloc.dylib 0x0000000191f01028 <redacted> + 648
9 libsystem_malloc.dylib 0x0000000191ef3240 malloc_zone_realloc + 180
10 libsqlite3.dylib 0x0000000193428c34 sqlite3_value_text + 1224
11 libsqlite3.dylib 0x000000019346ff38 sqlite3_rekey + 1568
12 libsqlite3.dylib 0x0000000193485f78 sqlite3_rekey + 91744
13 libsqlite3.dylib 0x00000001933f6c74 sqlite3_exec + 88428
14 libsqlite3.dylib 0x00000001933e5888 sqlite3_exec + 17792
15 libsqlite3.dylib 0x00000001933e3608 sqlite3_exec + 8960
16 libsqlite3.dylib 0x00000001933e2838 sqlite3_exec + 5424
17 libsqlite3.dylib 0x00000001933e1e2c sqlite3_exec + 2852
18 libsqlite3.dylib 0x00000001933e1ae0 sqlite3_exec + 2008
19 絕對潮流 0x1000b8d38 絕對潮流 + 757048
20 絕對潮流 0x1000b9380 絕對潮流 + 758656
21 絕對潮流 0x1000a83a0 絕對潮流 + 689056
22 絕對潮流 0x1000a845c 絕對潮流 + 689244
23 絕對潮流 0x1000b3bd8 絕對潮流 + 736216
24 絕對潮流 0x100077efc 絕對潮流 + 491260
25 絕對潮流 0x1000ceae8 絕對潮流 + 846568
26 絕對潮流 0x10009f2e8 絕對潮流 + 652008
27 libdispatch.dylib 0x0000000191d761fc <redacted> + 24
28 libdispatch.dylib 0x0000000191d761bc <redacted> + 16
29 libdispatch.dylib 0x0000000191d7ab2c _dispatch_main_queue_callback_4CF + 428
30 CoreFoundation 0x0000000192e9a810 <redacted> + 12
31 CoreFoundation 0x0000000192e983fc <redacted> + 1660
32 CoreFoundation 0x0000000192dc62b8 CFRunLoopRunSpecific + 444
33 GraphicsServices 0x000000019487a198 GSEventRunModal + 180
34 UIKit 0x0000000198e0d7fc <redacted> + 684
35 UIKit 0x0000000198e08534 UIApplicationMain + 208
36 絕對潮流 0x1000bf304 絕對潮流 + 783108
37 libdyld.dylib 0x0000000191da95b8 <redacted> + 4
)
dSYM UUID: 1CD37DB6-2A53-3394-9771-169AA2EFB537
CPU Type: arm64
Slide Address: 0x0000000100000000
Binary Image: 絕對潮流
Base Address: 0x000000010000c000
這類的崩潰信息通常難以重現(xiàn), 沒有任何的重現(xiàn)步驟,所以我們得找到發(fā)布該版本時的原始代碼,可能會需要回朔到以前的SVN或者Git版本。
然后找到當(dāng)時上傳代碼時使用的DYSM文件,這文件通常在.xcarchive文件中。 右鍵該文件, 然后通過Terminal工具cd到
cd /Users/us10/Library/Developer/Xcode/Archives/2017-01-12/絕對潮流\ 17-1-12\ 下午5.33.xcarchive/dSYMs/絕對潮流.app.dSYM/Contents/Resources/DWARF
注意:
1。對于成功生成archvie的項目, 在這個archive的包中, 是可以通過顯示包內(nèi)容, 看到DSYMs文件夾和一個products文件夾, 繼續(xù)顯示DSYMs文件夾下,可以看到一個xxx.app.DSYM文件,繼續(xù)對它顯示包內(nèi)容,可以看到Contents/Resources/DWARF/xxxx文件, 這個文件是編譯后的二進(jìn)制文件,通過它可以進(jìn)行反編譯,從而找到二進(jìn)制對應(yīng)的源碼位置。
2。 在xcode中,archive成功后, 會在Organizer界面中的Archives下, 可以看到所有的archive文件, 右鍵Show in Finder可以找到這個文件。
然后執(zhí)行 atos -arch arm64 -o 絕對潮流 0x10009f2e8 就可以看到這處內(nèi)存地址反編譯回來的源碼行。
eg:
atos -arch arm64 -o 絕對潮流 0x1000b3bd8
+[CLSqliteDB addBrowsingHistory:] (in ) (CLSqliteDB.m:28)
使用 xib 和 storyboard 的優(yōu)缺點
使用 xib 和 storyboard 的優(yōu)點
1、開發(fā)界面所見即所得,可以快速通過拖拽構(gòu)造界面。
2、你可以從 storyboard 中很方便地梳理出所有View Controller的界面間的調(diào)用關(guān)系。這一點對于新加入項目組的開發(fā)同事來說,比較友好。
3、使用 Storyboard 可以使用Table View Controller的 Static Cell 功能。對于開發(fā)一些 Cell 不多,但每個 Cell 都不一樣的列表類設(shè)置界面會比較方便。
4、通過實現(xiàn) – (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 方法,每個 View Controller 的跳轉(zhuǎn)邏輯都聚集在一處,這方便我們統(tǒng)一管理界面跳轉(zhuǎn)和傳遞數(shù)據(jù)。
5、Storyboard 可以方便將一些常用功能模塊化和復(fù)用。
使用 xib 和 storyboard 的缺點
1、xib 對版本管理是災(zāi)難。storyboard 實際上的多個 xib 的集合,所以更容易讓多人編輯產(chǎn)生沖突。而雖然它們是 xml 格式,但是沖突解決起來還是不如代碼那么容易。
2、蘋果對 xib, storyboard 的設(shè)計中帶有當(dāng)前電腦的操作系統(tǒng)版本和 Xcode 版本。所以如果兩個協(xié)作的開發(fā)者電腦操作系統(tǒng)或 Xcode 有不一樣的話,每次打開必定會修改這個文件。另外即使操作系統(tǒng)版本和 Xcode 版本一樣,有些時候打開看也會造成一些自動的修改。
3、storyboard 帶來的 segue 的概念對于開發(fā)來說并不省事,特別是在需要傳遞參數(shù)的時候。如果是用程序內(nèi)部 trigger 一個 segue,那么需要在另一個回調(diào)的地方設(shè)置 dest view controller 的參數(shù)信息。
4、我們發(fā)現(xiàn) xib 中設(shè)置的顏色值并不精確,RGB 在真機(jī) / 模擬器上常常會有 10 多像素的偏差。
5、xib 和 storyboard 對繼承的支持并不友好。無法做界面的繼承。
6、xib 和 storyboard 對搜索支持并不友好,無法方便地在 Xcode 中查找關(guān)鍵詞(但是可以通過寫 bash 命令來查找)。
7、storyboard 對組合支持得不太好,不允許在一個 xib 中附帶多個子 view。
8、xib 和 storyboard 不太方便做界面的模塊化管理,比如我們想統(tǒng)一修改界面中所有按鈕的字體樣式,那么在 xib 和 storyboard 只能一個一個手工修改,而如果是代碼編寫的,則只需要改一個工廠方法的實現(xiàn)即可。
9、對于復(fù)雜的 App,storyboard 的性能會比較差。
xib 和 storyboard 與手寫代碼的選擇
對于復(fù)雜的、動態(tài)生成的界面,建議使用手工編寫界面。
對于需要統(tǒng)一風(fēng)格的按鈕或UI控件,建議使用手工用代碼來構(gòu)造。方便之后的修改和復(fù)用。
對于需要有繼承或組合關(guān)系的 UIView 類或 UIViewController 類,建議用代碼手工編寫界面。
對于那些簡單的、靜態(tài)的、非核心功能界面,可以考慮使用 xib 或 storyboard 來完成。
你如何去把一個view的所有subview清空?
方法1:
如果知道NSArray有makeObjectsPerformSelector這個方法的人,他們能夠說出直接使用這個方法,然后在selector里面寫removeFromSuperView的selector,就好了,而且很省事,一句話就搞定。
方法2:
如果知道NSArray有enumerator方法的人,他們會說出使用這種方法枚舉每一個subview,在block里把removeFromSuperView調(diào)用起來,也差不多兩三行的事兒。
方法3:
不知道NSArray有上面這些方法的人,他會說用for...in...的方法遍歷,然后取到這每一個subview,讓他們執(zhí)行removeFromSuperView??赡芤ㄙM大概四五行。
//設(shè)置導(dǎo)航欄背景顏色為透明的
// UIImage *image = [[UIImage alloc] init];
// [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
// self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
10、UINavigationController設(shè)置為self.window的root視圖, 然后將UIVIewController設(shè)置為UINavigtionController的根視圖.在UIViewController中加入一個ScrollView,在ScrollView中加入一個view.
此時發(fā)現(xiàn). scrollView并沒有自動下移64像素,而 ScrollView中的子視圖VIew自動下移了64個像素.
解決方法:
self.automaticallyAdjustsScrollViewInsets = NO;
11、打印輸出:You've implemented -[<UIApplicationDelegate> application:didReceiveRemoteNotification:fetchCompletionHandler:], but you still need to add "remote-notification" to the list of your supported UIBackgroundModes in your Info.plist.
解決方法:
方法一:

第二種方法:
info.plist文件配置:Required background modes->App downloads content in response to push notifications