iOS 開發百問(9)


101、編譯錯誤:ld: library notfound for -lPods

當項目中使用了 cocoaPods 時,經常出現此錯誤(通常是 release 的時候)。

這是由於 pod install 后,cocoaPods 會創建一個新的 workspace。你必須關閉項目並重新打開。問題即可解決。

102、為什么 iOS 的時間總是比真實時間慢8小時       

例如,一個北京時間"2014-4-4 22:00"(字符串),需要轉換成 NSDate。字符串轉換成 NSDate 一般是通過 NSDateFormatter 進行的。而在 iOS 上 NSDate 以 GMT 時間存儲,因此NSDateFormatter會自動將字符串當前時區的本地時間處理,即將被轉換的北京時間(字符串"2014-4-4 22:00")換成 GMT 時間("2014-4-4 14:00")。如果直接把這個 NSDate(longlong,1970以來的秒數或毫秒數)傳給服務器,服務器會把這個時間當成北京時間使用(實際上它卻是GMT時間),這就導致時間差了8小時。

正確的做法是在這個 NSDate 的基礎上加上時差。而時差的計算需要知道當前時區。[NSTimeZonesystemTimeZone]可以得到當前時區(東8區),然后用 secondsFromGMTForDate: 方法可獲得這個時區(東8區)的時差(以秒計)。代碼如下:

NSDateFormatter* df=[NSDateFormatter new];

//        [dfsetLocale:[NSLocale  currentLocale]];

       df.dateFormat=@"yyyy-MM-dd HH:mm";

        NSDate* date=[dfdateFromString:@"2014-4-4 22:00"];

        NSTimeZone *zone =[NSTimeZone systemTimeZone];

        NSInteger interval = [zonesecondsFromGMTForDate: date];

        NSDate *localeDate =[date  dateByAddingTimeInterval:interval];

       NSLog(@"%@",localeDate);

103、禁止 UITableViewController 中鍵盤彈出動畫

TableViewController 中內置了鍵盤彈出動畫的代碼,當單元格中的輸入控件彈出軟鍵盤時,tableView 會自動向上滾動。但這個功能有時候會帶來大麻煩,因為有時候輸入控件會被滾動到不可視的地方。由於我們無法修改框架的代碼,所以這種情況下我們必須放棄使用 TableViewController(子類化),而改用一般的UIViewController+UITableView 代替。但有時候我們必須使用TableViewContrller——例如想使用它的靜態單元格,則可以通過下列方法解決。在UITableViewController 子類中覆蓋 viewWillAppear 方法,禁用父類的 viewWillAppear 行為。即不要調用[superviewWillAppear:animated]一句:

-(void)viewWillAppear:(BOOL)animated{

    // Override super method with don'tcall [super viewWillApper]

}

104、應該在什么時候使用 NSCache

NSCache 會自動根據內存壓力釋放其中的某個緩存對象(例如視圖被銷毀,或者緩存的對象實在太多)。因此 NSCache 緩存的對象必須是可以重建的,例如這些對象——可以在需要時從網絡上下載到的數據。否則,你不應當使用 NSCache——因為對象不知道什么時候就會被銷毀了。

因此,使用 NSCache 時必須注意,如果檢索的對象在 cache 中不存在,我們必須重建一個:

-(CachedObject)getCachedObject:(id)key{

    id* obj=[NSCacheObjectobjectForKey:key];

    if (cb==nil) {

       obj=[[CachedObjectalloc]init];  // Recreate cached object

       ……

    }

    return obj;

}

105、Pods 在 Xcode5 上Archive 的問題

問題描述:

Archive 時出現如下錯誤(debug 時可能是正常的):

ld: library not found for -lPods

問題是由於 Xcode5.x 現在會檢測依賴項目的 architecture ,其設置必須和主項目一致,否則該依賴項目會被拒絕(即不會編譯)。

解決辦法:

在 Pods 項目的所有 target 下,將他們的 architecture 設置為和主項目一致。

106、如何查看一個靜態庫支持的 Architecture

使用“lipo -info 靜態庫文件”命令,例如:

lipo -info Unrar4iOS

然后終端會作如下顯示:

Architectures in the fat file: Unrar4iOS are: armv7 armv6 i386

107、項目中引入某些靜態庫會導致在 Archive 時報“Undefined symbols forarchitecture armv7s/arm64”錯誤

正如問題 105 所述。除了用問題 105 中的解決方法,還有一種解決辦法。

首先查看該靜態庫的 Architecture(參考問題106)。然后修改 Scheme 為該靜態庫支持的 Architecture。然后修改 Buid Settings 中的 Build Active ArchitectureOnly(僅編譯為所選的架構),將值改為 Yes。然后編譯即可。

108、Autolayout 下,UITableView 的高度不正確

Autolayout 下,如果有導航欄,視圖上的 UITableView 受 constraints 的限制,運行時高度被 constraints 重新設置為沒有導航欄的高度。此時應該實現viewDidLayoutSubviews 方法,將 constraints 的影響排除:

- (void)viewDidLayoutSubviews {

_table.frame=CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);

}

109、如何修改默認返回按鈕的title?

假設導航為:A視圖-->B視圖

如果要改變B視圖返回到A視圖的返回按鈕的title,只需在A視圖中使用如下代碼:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:nil];

B視圖不用做任何操作。

110、有一個空對象,但它既不是 nil,也不是 null?

它是 NSNull。你可以打印這個對象(用 po 命令或者 NSLog),則打印結果是“<null>”,而不是“(null)”(nil 對象)。

由於O-C 的集合對象中不允許插入空值(nil),而 NSNull 並不是 nil,所以就用NSNull 對象來表示這個集合為空(表示列表結束)。而且,與 nil 不同,發送消息給一個 NSNull 將導致異常。

NSNull具有唯一的方法:[NSNull null]你可以用它來測試一個對象是不是 NSNull:

BOOL isNSNull(id any){

    return [any isEqual:[NSNullnull]];

}


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



iOS開發百問(4) iOS 開發百問(8) iOS 開發百問(9) iOS開發百問(4) iOS 開發百問(7) iOS 開發百問(1) iOS 開發百問(6) iOS 開發百問(9) iOS 開發百問(7) iOS 開發百問(6)
 
粤ICP备14056181号  © 2014-2021 ITdaan.com