問答題
-
iOS的開發和發布簽名證書有何異同?
開發簽名證書綁定App ID、開發者證書、以及測試設備,用于真機測試。
發布簽名證書綁定App ID和發布證書,用于上傳應用到App Store。
發布簽名證書綁定App ID、開發者證書、以及測試設備。用于生成ipa文件并deploy到對應的測試設備上進行測試。 - iOS的消息推送機制又叫通知機制,其包括兩類:本地通知和遠程通知。
具體可瀏覽:玩轉消息推送后臺之小白必讀(iOS篇) - 屬性readwrite,readonly,assign,retain,copy,nonatomic各是什么作用,在那種情況下使用?
readwrite 是可讀可寫特性。需要生成getter方法和setter方法時使用。
readonly 是只讀特性。 只會生成getter方法,不會生成setter方法,不希望屬性在類外改變時使用。
assign 是賦值特性。setter方法將傳入參數賦值給實例變量。聲明基本數據類型時使用。
retain 表示持有特性。setter方法的實現是release舊值,retain新值,傳入參數的retaincount會+1,用于OC對象類型。
copy 表示賦值特性。setter方法的實現是release舊值,copy新值。需要一份新的變量時使用,用于NSString、Block等類型。
nonatomic 非原子操作。決定編譯器生成的setter getter是非原子操作即setter getter方法的實現不加鎖,而atomic原子操作表示多線程安全,一般使用nonatomic。
注:
非原子性(nonatomic)訪問,對屬性賦值的時候不加鎖,多線程并發訪問會提高性能。如果不加此屬性,則默認是兩個訪問方法(setter getter)都為原子型事務訪問。atomic是Objc使用的一種線程保護技術,基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成數據錯誤。而這種機制是耗費系統資源的,所以在iPhone這種小型設備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇。
#import和#include有什么區別?@class呢?#import<>和#inport""有什么區別?
一般來說導入OC文件使用#import,導入C/C++文件使用#include。
#import 確定一個文件只能被導入一次,這使你在遞歸包含中不會出現問題。所以,#import比起#include的好處就是不會引起交叉編譯。
@class僅僅是聲明一個類名,并不會包含類的完整聲明。能解決循環包含的問題:當兩個類文件有循環依賴關系 ( A 引用 B , B 引用 A ) 時,需要用 @class。
#import<>用于對系統頭文件的引用,編譯器會在系統文件目錄下去查找該文件。
#import""是對用戶自定義的文件的引用,編譯器首先會在用戶目錄下查找,然后到安裝目錄中查找,最后在系統文件中查找。類別(category)的作用?繼承和類別在實現中有何不同?
類別是OC語言的一個特性??梢栽诓猾@取不改變原代碼的情況下往里面加入新的方法。只能添加,不能進行修改和刪除。如果類別和原來類中的方法產生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優先級。
繼承是面向對象的語言特性之一。子類會繼承父類的屬性和方法。繼承可以增加、修改、或者刪除方法,也可以增加屬性。Object-C的類可以多重繼承嗎?可以實現多個接口嗎?
Objective C不能直接使用多重繼承。NSObject類型的對象在實現多重繼承時用protocol委托代理來實現的。一個類可以實現多個接口。id,nil代表什么?
id:在代碼中,id是指向structobjc_object的一個指針,這個意思是說,id是一個指向任何一個繼承了Object(或者NSObject)類的對象。你在使用id的時候不需要加星號。比如id foo = nil定義了一個nil指針,這個指針指向NSObject的一個任意子類。而id* foo = nil則定義了一個指針,這個指針指向另一個指針,被指向的這個指針指向NSObject的一個子類。
nil:nil和C語言的NULL相同,在objc/objc.h中定義。nil表示一個Objctive-C對象,表示空。類變量的@protected,@private,@public聲明各有什么含義?
@private:私有的,作用范圍只能在自身類(外界既不可訪問,又不能繼承);
@protected:受保護的,作用范圍在自身類和子類,如果什么都不加修飾,默認是@protected(外界不可訪問,但是可以繼承);
@public:共有的,作用范圍最大,可以在任何地方被訪問(外界即可訪問,又可以繼承);試列舉UIKit 中常用的控件。
UILabel 文本標簽
UIButtton 按鈕
UITextField 文本輸入框
UIImageView 圖片顯示
UIAlertController 彈框視圖(UIAlertView 對話框,UIActionSheet 底部彈框)
UIScrollView 滾動視圖
UITableView 列表
UICollectionView
UINavigationBar 導航條
UISwitch 開關
UIPageControl 分頁控件
UITextView 文字顯示控件
UIPickerView 選擇器
UIDatePicker 日期選擇器
UIWebView 網頁顯示控件
UISlider 滑塊
UISegmentedControl 選項卡
UIActivityIndicatorView 活動指示器
UIProgressView 進度條
-
在開發過程中使用的HTTP網絡請求框架是什么?
AFNetworking(OC):
新版的AFNetworking棄用NSURLConnection,改用NSURLSession。同時基于NSURLConnection的AFHTTPRequestOperationManager也被棄用,改用AFHTTPSessionManager。
Alamofire(Swift):
其前身是AFNetworking,Swift發布后,AFNetworking的作者使用Swift寫了Alamofire。其本質是基于NSURLSession的。 -
數據持久化存儲主要有以下方式:
1)屬性列表(plist文件/Write寫入):永久保存在磁盤中。它是將某些特定的類,通過XML文件的方式保存在目錄中。存儲時使用writeToFile: atomically:方法。讀取時使用arrayWithContentsOfFile:方法。
2)偏好設置(preference/NSUserDefaults ):用戶再次打開程序或開機后數據仍然存在。獲取文件并寫入[[NSUserDefaults standardUserDefaults] setInteger: forKey:@“ ”]。立即同步[userDefaults synchronize]。可以存儲的數據類型包括:NSData,NSString,NSDate,NSArray,NSDictionary。缺點:如果要存儲其它數據類型,需要轉換成前面的數據類型才可以存儲。
3)對象歸檔(NSKeyedArchiver):采用歸檔形式來保存數據,數據對象需要遵守NSCoding協議,對象對應的類須提供encodeWithCoder:和initWithCoder:方法。會進行加密處理,數據進行歸檔處理后會轉換成二進制數據。缺點:對數據的操作比較笨拙,如果想改動數據的某一小部分,需要解壓和歸檔整個數據,所以只能針對小量數據。
4)SQLite3:是一個開源的嵌入式關系數據庫,適合存儲大量的數據。FMDB是以OC的方式封裝了SQLite的C語言API。使用起來更加面向對象,省去了很多冗余的C語言代碼。對比蘋果自帶的Core Data框架,更加輕量級、靈活。提供了多線程安全的數據庫操作方法,有效的防止數據混亂。
5)CoreData:它是蘋果官方對SQLite的一個升級,是一個完全面向對象的API。需要建立模型對象,也就是建立對象之間的映射。生成模型對象實體。 -
說說你對Runtime的理解。
Runtime 基本上是用C和匯編寫的。它是一套比較底層的C語言的API。我們寫的程序在運行過程中都會被轉換成runtime 的C代碼執行。我們需要了解的是OC是一門動態語言,它會將一些工作放在代碼運行時處理,而并非編譯時。因此,我們需要一個運行時系統來處理編譯后的代碼。
Objc 在三種層面上與 Runtime 系統進行交互:
1)通過 Objective-C 源代碼
2)通過 Foundation 框架的 NSObject 類定義的方法
3)通過對 Runtime 庫函數的直接調用 -
在做界面適配的時候有方法?
1)人工根據frame計算
2)Xib/Storyboard添加約束
3)AutoLayerOut(Masonry第三方庫/系統Api) -
實現多線程的方法有哪些?
1)NSThread:比較早的多線程方法。需要自己管理生命周期和線程同步,不推薦使用。
2)Grand Centeral Dispatch(GCD):簡單的說GCD就是把操作放在隊列中去執行。操作分為同步操作和異步操作。隊列分為串行隊列和并行隊列。異步操作只有在并行隊列中才有效。
3)NSOperation:對GCD操作的抽象。分為NSInvocationOperation和NSBlockOperation
4)NSOperationQueue:對隊列的抽象 -
說說瀑布流如何實現的。
瀑布流是使用UICollectionView來實現的。主要是運用UIColectionViewLayOut,因此我們需要自定義一個layout來繼承系統的UICollectionViewLayOut 。瀑布流的思路是,從上往下哪一列最短,就把item放在哪一列的下面。因此,需要一個字典來記錄每一列的Y值。 -
數據加密------MD5(不可逆)
直接使用MD5進行加密,去MD5解密網站可暴力破解。數據只有在初次出現時是明文,其它情況均是密文處理。
MD5的改進:
1)加鹽:在明文的固定位置加入隨機串,然后再進行MD5。使用MD5解密后很容易發現規律。
2)多次MD5加密。通過MD5解密后發現還是密文,繼續進行MD5解密。
3)先加密后亂序:先對明文進行MD5,然后對加密得到的MD5字符串進行亂序。破解難度增加。 -
數據解析
Json格式:
1)NSJSONSerialization,官方提供的Json數據格式解析類,iOS5以后支持
2)JSONKit,SBJson,TouchJson(第三方庫)
XML格式:
1)NSXMLParse官方自帶
2)GDataXML,Google提供的開源XML解析庫 -
說說OC與Swift 混編的實現
在OC項目中首次添加Swift文件時,Xcode會提示是否配置OC橋接文件。點擊確認后,系統會自動生成一個項目名-Bridging-Header.h文件。將需要進行橋接的OC頭文件添加進去即可。 -
微信支付和支付寶支付的實現
兩者大同小異。均按照開發文檔進行操作即可。
1)首先,需要有微信開放平臺的開發者賬號,將應用進行注冊,通過審核后,將獲得AppID和AppSecret(商戶密鑰)。
2)然后,在開放平臺的文檔中心下載iOS的SDK。將SDK 添加到工程中,并進行一系列的配置(在AppDelegate中設置相應的函數)。
3)最后,根據Demo進行開發實現即可。
如果在微信支付的時候,跳轉到微信支付界面彈出了一個確定按鈕,頁面空白,這個很有可能是你的APP_SECRET沒有設置對,這東西的作用是在對支付參數進行md5加密時所用到的key。 -
iOS設備提供哪三種不同定位途徑
1)蜂窩式移動電話基站定位;
2)WiFi定位,通過查詢一個WiFi路由器的地理位置信息,比較省電;
3)GPS衛星定位,通過3~4顆衛星定位,最為準確,但是耗電量大。
iOS系統如果能夠接收GPS信息,那么設備優先采用GPS,其次是WiFi,最后是基站,開發人員不能選擇哪種定位方式。
系統定位服務直接使用CoreLocation框架。系統地圖直接使用地圖框架MapKit。注意iOS8之后的定位,需要在info.plist中添加 Location Usage Description,NSLocationAlwaysUsageDescription -
為什么iOS開發較多的使用高德地圖,而較少的使用百度地圖?
1)iOS在國內默認使用高德地圖
2)高德地圖是火星坐標系,mapView獲取經緯度不需要轉
3)百度地圖使用的是自己的坐標系,獲取到的點要轉成火星 -
高德地圖開發的實現
1)首先,注冊高德地圖開發者賬號,獲取高德地圖AppKey(需要輸入應用名和Bundle Identifie)
2)其次,下載并導入高德地圖SDK,并參照開發文檔進行簡單的配置
3)最后就可以參照Demo進行開發了。 -
SVN和Git
CornerStone是Mac上最佳的SVN管理工具。
對于git,可以使用終端管理,也可以借助GitHubDeskTop 管理。 -
Cocoa和Cocoa Touch的區別:
它們都包含Objective-C運行時和兩個核心框架:
Cocoa包含Foundation和AppKit框架,用于開發Mac OS X系統的應用。Cocoa Touch是Cocoa的子類,包含Foundation和UIKit框架,用于開發iPhone OS系統的應用程序。Cocoa是 Mac OS X 的開發環境,Cocoa Touch是 iPhone OS的開發環境。Cocoa Touch與Cocoa一個比較鮮明的區別就是Cocoa Touch并不支持垃圾回收機制。
Foundation提供了一系列基礎數據類型、以及枚舉、容器的支持。來自于這個框架的類名以NS開頭。UIKit:iOS上的用戶圖形包。UI開頭的類都來自于這個框架。 -
IB中的User Defined Runtime Attributes如何使用?
Xib或Storyboard中,使用User Defined Runtime Attributes可以對控件的屬性進行動態的設置。點擊“+”,“-”可以添加,刪除屬性。常設置的屬性有layer.cornerRadius,layer.borderWidth,layer.borderColorFromUIColor等。需要注意的是它是沒有報錯機制的,我們必須保證每一個屬性都要寫正確,每個Type的數據類型選擇正確。下面是一些可用的Attribute Types與其相對應的數據類型:
Boolean – BOOL
Number – NSNumber * or any numeric scalar, e.g. NSInteger
String – NSString *
Point – CGPoint
Size – CGSize
Rect – CGRect
Range – NSRange
Color – UIColor *
編程題
-
In stream of integers from 1 to n, only one number will be repeated. How can you tell what that number is?
思路:先把數組排序,一次循環比較第i個元素和第i+1個元素是否相等。若想等,終止循環并輸出重復的數字。
代碼:swift版
let array:[Int] = [1,12,9,8,10,7,4,10,2,6]
var resultArr:[Int] = []
resultArr = array.sorted() //從小到大排序
for i in 0..<(resultArr.count-1) {
if resultArr[i] == resultArr[i+1] {
print("重復的數字是\(resultArr[i])")
break
}
}
-
用1,2,3,4,5,6,7,8,9組成三個三位數abc,def,ghi,每個數恰好使用一次,要求abc:def:ghi=1:2:3,輸出所有解。
具體代碼.jpg
期待你的評論建議O(∩_∩)O~