iOS開發基礎知識--碎片42

iOS開發基礎知識--碎片42

 iOS開發基礎知識--碎片42

1:報thread 1:exc_bad_access(code=1,address=0x70********) 閃退javascript

這種錯誤一般是內存管理的問題,通常是訪問了已經釋放的對象致使的,能夠開啓殭屍對象(Zombie Objects)來定位問題:html

在Xcode的菜單:java

Product->Scheme->Edit Scheme->Rungit

右邊的選項中,選中Enable Zombie Objects,就能夠查看詳細的錯誤信息;github

 

2:靜態庫(SDK)知識點架構

複製代碼
1.1 靜態庫和動態庫的存在形式:
靜態庫:.a 和 .framework
動態庫:.dylib 和 .framework

1.2 靜態庫和動態庫的區別
靜態庫:連接時,靜態庫會被完整地複製到可執行文件中,被屢次使用就有多份冗餘拷貝
動態庫:連接時不復制,程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存

注意:項目中若是使用了動態庫,會蘋果拒接

1.3 靜態庫文件的版本(4種)
真機-Debug版本
真機-Release版本
模擬器-Debug版本
模擬器-Release版本

1.3.1 Debug(調試)版本
1.含完整的符號信息,以方便調試
2.不會對代碼進行優化

1.3.2 Release(發佈)版本
1.不會包含完整的符號信息
2.的執行代碼是進行過優化的
3.的大小會比Debug版本的略小
4.在執行速度方面,Release版本會更快些(但不意味着會有顯著的提高)

因此咱們通常開發中都打包Release(發佈)版本,提供外界,注意分別在兩種模式下生成後再合併;

設備的CPU架構簡介(補充知識)

模擬器:
4s~5 : i386
5s~6plus : x86_64

真機:
3gs~4s : armv7
5~5c : armv7s (靜態庫只要支持了armv7,就能夠跑在armv7s的架構上)
5s~6plus : arm64
複製代碼

a:由於動態的.framework蘋果上架是不容許,因此只能以靜態的方式;製做靜態庫時記得選擇目標要運行的IOS版本;iphone

b:關於資源文件bundle在生成framework後會有包含,能夠手動把bundle移出來,而後一塊兒給調用者,不然放在framework在項目中沒法引入bundle,一直沒法識別出來;post

c:查看目前支持的CPU架構,地址要正確,而後運用lipo -info (下面這個是針對framework,若是是.a 能夠直接對lipo -info xxxx.a查看)優化

wjy-MacBook-Pro:Products wujunyang$ cd /Users/wujunyang/Library/Developer/Xcode/DerivedData/jiaCoreSDK-bgpoefwfpffqejccohhhngirohwn/Build/Products/Debug-iphoneos 
wjy-MacBook-Pro:Debug-iphoneos wujunyang$ lipo -info jiaCoreSDKLib.framework/jiaCoreSDKLib
Architectures in the fat file: jiaCoreSDKLib.framework/jiaCoreSDKLib are: armv7 arm64 

framework合併指令ui

lipo -create Debug-iphoneos/jiaCoreSDK_Share.framework/jiaCoreSDK_Share Debug-iphonesimulator/jiaCoreSDK_Share.framework/jiaCoreSDK_Share -output jiaCoreSDK_Share

注意framework是針對.framework裏面的文件進行合併,而後生成一個,再把它替換其中一個.framework,這個即是咱們想要的文件;

關於.a的合併能夠見下面的文章;

d:.a跟.framework不一樣,.a要把開放的頭文件都放到調用的項目中,而.framework能夠只開放一個頭文件出來;可是兩個裏面的public放頭文件都仍是必須;

e:製做靜庫時記得把tagerts中的Build Settings的Mach-O Type設置成Static Library

f:注意設置.a或.framework技術的最低IOS版本;在生成時分別在真機跟模擬器上生成而後再合併;

g:關於如何建立.a及.framework的知識點:

地址:http://www.jianshu.com/p/8f5b9855efb8【iOS 靜態庫開發】

地址:http://www.cnblogs.com/richard-youth/p/4856841.html【iOS靜態庫小結--(yoowei)】

地址:http://www.jianshu.com/p/c305175bfab2【iOS開發拓展篇—靜態庫】

地址:https://github.com/wujunyang/jiaCoreSDK【小實例】

地址:https://www.sdk.cn/news/3342 【靜態庫包含其它靜態庫SDK應該注意的問題】

 

3:iOS代理(protocol與delegate)很形象的實例

讓咱們先來看下protocol和delegate運用的代碼,有一個總體的瞭解

假定有兩個類:personOne和personTwo

personOne是委託者,personTwo是代理者。

pesonOne.h

複製代碼
#import <Foundation/Foundation.h>
@protocol SomeThing<NSObject>
//須要被代理的事件
- (void) doSomeThing:( NSString *)someThing;
@end
@interface PersonOne : NSObject
//有件事情須要別人替本身作
//代替本身的人必需要會作這個事情,須要知道了解相關的協議;
@property (weak) id <SomeThing> delegate;
//weak:不須要爲這個delegate分配空間,由於作完就走人了。
//id:只要是個對象就能夠。
@end
複製代碼

personTwo.h

#import <Foundation/Foundation.h>
#import "PersonOne.h"
@interface PersonTwo : NSObject<SomeThing>
//加上<SomeThine>表示代理人知道了相關協議,能夠接手代理。
@end

personTwo.m

複製代碼
#import "PersonTwo.h"
@implementation PersonTwo
//代理開始去作委託方交代的事情(必須實現)
-(void) doSomeThing:(NSString*) someThing
{    
    NSLog(@"%@............",someThing);
}
@end
複製代碼

雙方真正的實現相互關聯

main.m

複製代碼
#import <Foundation/Foundation.h>
#import "PersonTwo.h"
#import "PersonOne.h"
int main(intargc, const char * argv[]) {
     @autoreleasepool{
  //真正的實現代理方與委託方之間的關聯
    PersonOne *pA = [[PersonOne alloc]init];         
    PersonTwo *pB = [[PersonTwo alloc]init];         
  //pB代替pA去完成事件
    pA.delegate = pB;
  //用 pA.delegate 判斷是否存在pB
  //用 [pA.delegate respondsToSelector:@selector(doSomeThing:)] 判斷pB是否實現了要求的方法。
if (pA.delegate && [pA.delegate respondsToSelector:@selector(doSomeThing:)]) {
  //pA提供一個參數給pB(只負責提供參數,無論具體使用)
    [pA.delegate doSomeThing:@"hello world"];
        }
    }
    return  0;
  }
複製代碼

用一個形象的比喻來講明這一整個代理事件:

一個咖啡廳生意很是好,老闆 (personOne) 決定招一個咖啡師來幫忙。因而就貼出了一則公告 (delegate)

公告內容:(protocol)

招聘一名咖啡師,有一年經驗以上。會調酒者優先錄取。

從這個公告中,能夠知道兩點:

1-會作咖啡,而且有一年以上的經驗是 必須的條件 (@required:必須實現的方法)

2-會調酒是 可選,非必須的條件 (@optional:可選 實現的方法(能夠所有都不實現))

因此,凡是前來應聘的必須都要知足第一個條件,第二個條件只是加分項而已,並不是不可缺的。

招到了員工B之後,老闆要求B作一杯摩卡。至於B怎麼作,老闆是不會關心的,他只關心結果。

([pA.delegate doSomeThing:@"hello world"];) ——>[老闆.delegate 作咖啡:@"摩卡"];)

 

4:使用Cordova進行iOS開發知識

使用Cordova進行iOS開發 (環境配置及基本用法) :http://www.jianshu.com/p/d24219c008b6

使用Cordova進行iOS開發 (第三方插件的使用:Camera插件):http://www.jianshu.com/p/1e3d0c915dbc

使用Cordova進行iOS開發 (已存的項目中添加Cordova及自定義插件):http://www.jianshu.com/p/e982b9a85ae8 

Cordova插件開發入門(IOS版OC跟JS交互):http://my.oschina.net/crazymus/blog/516388

淺析 Cordova for iOS(OC跟JS交互的說明):http://www.cocoachina.com/industry/20130520/6238.html

注意:在較新的版本,若是生成的項目沒有改變時,路徑只要輸入引入插件指令,會把OC代碼跟XML配置都已經更新好了,上面第二個文章不少步驟均可以省略;

定位插件:

進入到目錄後在終端命令輸入(引入定位插件):

cordova plugin add cordova-plugin-geolocation

修改index.html代碼:

複製代碼
<!DOCTYPE html>
<html>
    <head>
        <title>Capture Photo</title>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8">
        <script type="text/javascript" charset="utf-8" src="cordova.js"></script>
        <script type="text/javascript" charset="utf-8">
 
            document.addEventListener("deviceready",onDeviceReady,false);
 
            //Cordova加載完成會觸發
            function onDeviceReady() {
            }
 
            function getCurrentPosition(){
                //定位數據獲取成功響應
                var onSuccess = function(position) {
                    alert('緯度: '          + position.coords.latitude          + '\n' +
                          '經度: '         + position.coords.longitude         + '\n' +
                          '海拔: '          + position.coords.altitude          + '\n' +
                          '水平精度: '          + position.coords.accuracy          + '\n' +
                          '垂直精度: ' + position.coords.altitudeAccuracy  + '\n' +
                          '方向: '           + position.coords.heading           + '\n' +
                          '速度: '             + position.coords.speed             + '\n' +
                          '時間戳: '         + position.timestamp                + '\n');
                };
 
                //定位數據獲取失敗響應
                function onError(error) {
                    alert('code: '    + error.code    + '\n' +
                          'message: ' + error.message + '\n');
                }
 
                //開始獲取定位數據
                navigator.geolocation.getCurrentPosition(onSuccess, onError);
            }
        </script>
    </head>
    <body style="padding-top:50px">
        <button style="font-size:23px;" onclick="getCurrentPosition();">獲取位置信息</button>
    </body>
</html>
複製代碼
相關文章
相關標籤/搜索