一.? 如果import用了C++的東西的,要把自己的.m文件改成.mm文件
二.嘗試iOS device時鏈接期提示警告信息:
ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in _FT_Stream_Open from /Users/kres/Downloads/freetype-2.4.9/libfreetype.a(ftsystem.o). To fix this warning, don’t compile with -mdynamic-no-pic or link with -Wl,-no_pie
查了一下,所謂的PIE是指position independent executable,即地址無關exe,換句話說也就是生成的機器碼中不能出現lea rax, some_symbol_name這樣的絕對尋址,而只能以:lea rax, [rel some_symbol_name]這種形式出現,目的是為了提高安全性,這樣OS可以以隨機的地址加載exe。去掉CFLAGS中的-mdynamic-no-pic后重新編譯鏈接armv6 armv7兩個版本的free type代碼,警告去除,不知是否會有副作用,繼續體驗…
這種警告解決的辦法:targets-->build Settings-->Linking-->Don't create Position Independent Executables
設置為YES.警告自然消除。
三.Applications using Launch Screen Files and targetting iOS 7.1 and earlier need to also include a Launch Image in an Asset Catalog.
I ran into the exact same problem this morning. Here's how I fixed it.
Select your project in the project navigator. Under the General tab, you should see the section for App Icons and Launch Images. Where you see Launch Images Source, click 'Use Asset Catalog'.
You will then see Migrate launch images to an asset catalog dialogue. Click 'Migrate'.
Make sure that your Launch Images Source on the previous screen points to the right image set in your asset catalog. In your case, you would set it to 'Default'.
四.-ObjC
最近在做一個項目的時候,需要使用到一個第三方庫,這個庫的使用向導里面特別說明,在添加完該庫后,需要在Xcode的Build Settings下Other Linker Flags里面加入-ObjC標志,這個標志以前沒使用過,所以我就專門研究了一下它的作用。
之所以使用該標志,和Objective-C的一個重要特性:類別(category)有關。根據這里的解釋,Unix的標準靜態庫實現和Objective-C的動態特性之間有一些沖突:Objective-C沒有為每個函數(或者方法)定義鏈接符號,它只為每個類創建鏈接符號。這樣當在一個靜態庫中使用類別來擴展已有類的時候,鏈接器不知道如何把類原有的方法和類別中的方法整合起來,就會導致你調用類別中的方法時,出現"selector not recognized",也就是找不到方法定義的錯誤。為了解決這個問題,引入了-ObjC標志,它的作用就是將靜態庫中所有的和對象相關的文件都加載進來。
本來這樣就可以解決問題了,不過在64位的Mac系統或者iOS系統下,鏈接器有一個bug,會導致只包含有類別的靜態庫無法使用-ObjC標志來加載文件。變通方法是使用-all_load 或者-force_load標志,它們的作用都是加載靜態庫中所有文件,不過all_load作用于所有的庫,而-force_load后面必須要指定具體的文件。
明白了這些, 就清楚,這個第三方庫中一定是定義了一些類別來擴著已有類,打開頭文件,發現果然如此。
一些第三方庫里對系統庫的類加了 category ,
這時,就需要使用編譯參數: -ObjC ,這樣第三方庫中對系統類作的擴展方法才能在工程中使用。
但是使用 -Objc 后,會產生兩個問題:
1 、 undefined symbols
2 、 duplicate symbol
undefined symbols 說明工程中沒有引入第三方庫引用的庫。
如果不加 -ObjC 參數,則在編譯時不會出錯,但運行時用到了沒引用庫的方法,則系統會崩潰。
這個問題好解決。只要找到缺的庫,引入工程就可以了。
duplicate symbol 的問題就不好解決了,說明第三方庫中的類名和工程中的類名,或其它第三方庫中的類名重名了。
最常見的比如 Reachability 這個類,如果第三方庫中引用了,自己的工程中也引用了,就會報 duplicate symbol 。
如果引用的第三方庫沒有源代碼,就只能將自己工程中的重名類重命名了。
應對上面的問題,如果自己要制作一個庫的話,要注意兩點:
1 、避免對系統類加 category, 這樣,別人用你的庫時,不加 ObjC 參數也可以用你的庫。
2 、如果庫中用到了其它的第三方的源代碼,尤其是用的比較普遍的,如 Reachability, 一定一定要對
這些類重命名,最常見的作法就是給類名加個前綴。以避免別人用你的庫時,產生 duplicate symbol 的問題。
五.關于問題ld:library not found for -lXXX 和ld:warning:directory not found option 以及duplicate symbol的解決辦法
ld:library not found for -lXXX 的問題有可能是你的某個庫的連接引用有問題,解決的辦法就是在項目的target里,選中Link Binary With Libraries 里的.a或framework 取消再加入,就可以了
六.No known instance method for selector 'respondsToSelector:'
協議里找不到這個方法?
這個是沒有繼承基協議造成的 繼承下<NSObject>
七.今天放在button上的圖片 放什么都變成藍色 郁悶了一個小時才發現
buttonWithType:UIButtonTypeCustom 寫成了buttonWithType:UIButtonTypeSystem
WTF!
在button中犯的錯 還有一個就是 我重寫了一個button類 替換的 時候 沒有替換alloc里面的UIButton
八.xcode中 有時候會報一個警告:
[WARN]Warning: Multiple build commands for output file /xxx
要解決這個問題很簡單:
1.選擇你的工程
2.選擇target
3.點擊 Build Phases
4.展開Copy Bundle Resources
5.刪除里面的剛才提示警告的文件,一般為紅色的名字的文件
九.關于屏幕旋轉
我每次轉動屏幕的時候 ?就老是電池條跑啊跑的 把這個刪了 整個世界就清凈了
按我的理解 這個東西 用SB寫界面的可以留著 ? 用代碼寫的就刪了吧
十.Duplicate declaration of method 'XXXXXXX:'
duplicate ['dju:plik?t, 'dju:plikeit]n. 副本;復制品
declaration [dekl?'re??(?)n]n. (納稅品等的)申報;宣布;公告;申訴書
方法重復申明了