IOS筆試題
面試題網(wǎng)址http://www.mianwww.com/html/category/it-interview/mobile
屬性readwrite、readonly、assign、retain、copy充尉、nonatomic各是什么作用,在那種情況下用?
assign用于簡單數(shù)據(jù)類型闯第,如NSInteger,double,bool,retain和copy用于對象,
readwrite是可讀可寫特性缀拭;需要生成getter方法和setter方法時咳短;
readonly是只讀特性 只會生成getter方法 不會生成setter方法 ;
不希望屬性在類外改變assign是賦值特性,setter方法將傳入?yún)?shù)賦值給實例變量蛛淋;僅設置變量時咙好;
retain表示持有特性,setter方法將傳入?yún)?shù)先保留褐荷,再賦值勾效,傳入?yún)?shù)的retaincount會+1;copy表示賦值特性,setter方法將傳入對象復制一份;需要完全一份新的變量時层宫。nonatomic非原子操作绘迁,決定編譯器生成的setter getter是否是原子操作,
atomic表示多線程安全卒密,一般使用nonatomic-
Object -C 中創(chuàng)建線程的方法時什么缀台?如果在主線程中執(zhí)行代碼,方法時什么哮奇?如果想延遲執(zhí)行代碼膛腐,方法又是什么?Phread鼎俘、NSThread哲身、GCD、NSOperation回到主線程的方法:
方法一:dispatch_async(dispatch_get_main_queue(), ^{ ….. });
方法二:
[self performSelectorOnMainThread: withObject:image waitUntilDone:YES];
延遲執(zhí)行的方法: //延遲加載 3秒后執(zhí)行show方法
方法一:performSelector方法
//[self performSelector:@selector(show) withObject:nil afterDelay:3];
方法二:定時器
//[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(show) userInfo:nil repeats:NO];
方法三:sleep
// [NSThread sleepForTimeInterval:3];
// [self show];
方法四:GCD
dispatch_time double delayInSeconds = 3.0; __block ViewController* bself = self; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW,(int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^{ [bself show]; });
-
#import跟#include有什么區(qū)別贸伐,@class呢勘天?
#import能避免頭文件被重復包含的問題:
- C/C++中包含頭文件時用#include。( 使用include要注意重復引用的問題:解決辦法#ifndef/#define/#endif)
-
#import 確定一個文件只能被導入一次,避免了重復引?的問題,在OC中我們基本用的都是 import捉邢。 #import< > 包含iOS框架類庫?的類, #import""包含項目中自定義的類脯丝。@class通知編譯器,其后面聲明的名稱是類的名稱伏伐,至于這些類是如何定義的宠进,暫時不用考慮
-
Object C中書寫一個單例模式,使用GDB寫單例藐翎?
//方法一:static SingletonPattern* _singletonPatternByNormal;+(id)sharedSingletonPatternByNormal{ if(!_singletonPatternByNormal) { _singletonPatternByNormal=[[SingletonPattern alloc]init]; } return _singletonPatternByNormal;}
//方法二://使用GCD dispatch_once
//適用場景:多線程安全
static SingletonPattern* _singletonPatternByGCD;
+(id)sharedSingletonPatternByGCD{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_singletonPatternByGCD =[[SingletonPattern alloc]init];
});
return _singletonPatternByGCD;}
-
說明week和__week的作用及常用在什么時候材蹬?
week 一般是在屬性的聲明中 在@propert后面使用
__week 一般是在對象的聲明中使用@property (weak, nonatomic) IBOutlet UIImageView *ImageView;__weak TRPoint *p1 = nil;//__weak將指針p1定義為弱引用
當弱引用指向一個強引用所持有的對象時,當強引用將對象釋放掉后吝镣,弱引用會自動的被賦值為ni
-
書寫一個block堤器、并簡單描述block ?
int (^block2)(int ,int)=^(int nAdd1,int nAdd2){ NSLog(@"有參數(shù)有返回值的block被執(zhí)行"); return nAdd1+nAdd2; };
Object C
中多線程有幾種實現(xiàn)方式末贾,都有什么闸溃?簡述Objective-C內(nèi)存管理MRC與ARC的關(guān)系及其區(qū)別?
MRC 手都內(nèi)存管理未舟;ARC是自動內(nèi)存管理圈暗。
當我們使用alloc,retain,new,copy或者mutableCopy的時候,引用計數(shù)+1,當我們使用release的使用,引用計數(shù)-1,當引用計數(shù)為0的時候,這個對象才會被徹底銷毀,對象在銷毀之前系統(tǒng)會自動的調(diào)用dealloc方法,在dealloc方法里面,如果這個對象還持有其他對的指針,那么需要先對這些指針進行release,再調(diào)用[super dealloc];IOS中持久化方式有哪些?
NSUserDefaults裕膀、plist员串、Archiving:歸檔、SQLite3和Core Data通知和代理的區(qū)別昼扛?
觀察者模式:一個對象(A)想知道另一個對象(B)的狀態(tài)是否發(fā)生了變化寸齐,A對象隨B對象狀態(tài)的改變而改變的過程欲诺,可以用觀察的過程來控制,這種兩個對象保持狀態(tài)改變的一致的模式渺鹦,叫做觀察者模式
------共同點 利用通知和代理都能完成對象間的通信扰法。(比如A對象告訴D對象發(fā)生了什么事情,A對象傳遞數(shù)據(jù)給D對象)
------不同點 代理:只能是一對一的關(guān)系(一個對象只能告訴另外一個對象發(fā)生了什么事情)通知:多對多關(guān)系(一個對象能告訴N個對象發(fā)生了什么事情毅厚,一個對象能得知N個對象發(fā)生了什么事情)
補充題目塞颁。MRC中Setter方法的實現(xiàn)setter方法的實現(xiàn)
-(void)setCar:(Car *)car {
if(_car!=car) {
[_car release];//對舊對象release一次
_car = [car retain];//對新對象retain一次}
}
1.Objective-C有多重繼承嗎?不是的話有什么代替方法吸耿?
沒有多重繼承( )多繼承在這里是用protocol 委托代理 來實現(xiàn)的
2.簡述#import跟#include的區(qū)別祠锣,@class呢?
#import和#include區(qū)別在與防止重復加載頭文件
#import和@class @class 一般出現(xiàn)在頭文件(.h)中咽安。#import用于.m中伴网。
例如A->B ,B->A.相互依賴時import會報錯
3.簡述線程與進程的區(qū)別和聯(lián)系?
進程和線程都是操作系統(tǒng)中程序運行的基本單元妆棒,系統(tǒng)利用該基本單元實現(xiàn)系統(tǒng)對應用的并發(fā)性澡腾。差別在與不同的操作系統(tǒng)資源管理方式。
進程有獨立的地址空間糕珊,一個進程崩潰后动分,在保護模式下不會對其它進程產(chǎn)生影響,而線程知識一個進程中的不同執(zhí)行路徑放接。
線程有自己的堆棧和局部變量刺啦,但線程之間沒有獨立的地址空間,一個線程死掉就等于整個線程死掉纠脾,所以多進程的程序要比多線程的程序健壯,但在進程切換時蜕青,耗費資源較大苟蹈,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發(fā)操作右核,只能用線程慧脱,不能用進程。
4.簡述readwrite贺喝,readonly菱鸥,assign,retain躏鱼,copy氮采,nonatomic屬性的作用?
readwrite 是可讀可寫特性染苛;
需要生成getter方法和setter方法時readonly 只讀屬性鹊漠,只有g(shù)etterassign 是賦值特性,setter方法將傳入?yún)?shù)賦值給實例變量;
僅設置變量時躯概;retain 表示持有特性登钥,setter方法將傳入?yún)?shù)先保留,再賦值娶靡,傳入?yún)?shù)的retaincount會+1;
copy 表示拷貝特性牧牢,setter方法將傳入對象復制一份;
需要完全一份新的變量時姿锭。nonatomic 非原子操作塔鳍,決定編譯器生成的setter getter是否是原子操作,atomic表示多線程安全艾凯,一般使用nonatomic
5.你在開發(fā)項目時献幔,用到了哪些數(shù)據(jù)存儲方式,iPhone中常見的方式有哪些趾诗,各有什么區(qū)別蜡感?
NSUserDefault (偏好設置) plist (屬性列表) Archiving (歸檔) SQList Core Data
- 定義屬性時,什么情況使用copy恃泪,assign和retain郑兴?
當我們需要獲得一份全新的數(shù)據(jù)時采用copy;assign 設置變量參數(shù)時使用贝乎;retain
7.autorelease的對象是在什么時候被release的情连?
只是引用計數(shù)減一的時機不同而已,autorelease會在對象的使用真正結(jié)束的時候才做引用計數(shù)減一
8.對于C++/OC來說,類(class)與結(jié)構(gòu)(struct)有什么區(qū)別览效?
class是引用類型却舀,struct是值類型。引用類型a2值改變a1 也改變值類型a1付給a2開辟一塊新的空間锤灿,a2改變a1不會隨著改變挽拔。
9.內(nèi)存的分配方式有哪幾種?請簡述但校。
1從靜態(tài)存儲區(qū)域分配螃诅。內(nèi)存在程序編譯的時候就已經(jīng)分配好,這塊內(nèi)存在程序的整個運行期間都存在状囱。例如全局變量术裸,static變量。
2亭枷、在棧上創(chuàng)建袭艺。3、從堆上分配
10.冒泡排序
排序int num[ ] = {2,3,6,4,8,7}
int = i, j;
for(i = 0; i < num.count; i++ ) {
for (j = 0; j < num.count - i -1; j++ ) {
if( num[j]>num[j+1]) {
int temp = num[j];
num[j] = num[ j+1 ];
num[j+1] = temp;
}
}}
11.什么是代理(delegate),什么是協(xié)議(protocol)?兩者有什么關(guān)系嗎奶栖?
delegate它本身是一個設計模式匹表,它的意思是委托別人去做某事门坷。protocol協(xié)議就是要做的事。
12.根據(jù)你的理解袍镀,手工寫出下面屬性定義的setter方法默蚌。
@property(nonatomic,retain)NSString*name;-(void)setName:(NSString *)str { [str retain]; [name release];4 name = str;}
13.簡述retain和copy的區(qū)別對象指向的還是原來的地址 引用計數(shù)器+1copy 將對象拷貝一份,完全新的簡述ios的內(nèi)存管理機制苇羡?自動內(nèi)存計數(shù) 系統(tǒng)手動內(nèi)存計數(shù) 程序員自己回收 誰創(chuàng)建誰銷毀 簡述你對 retain,copy,assign,strong,weak屬性的理解绸吸?
retain:用于指針變量。就是說你定義了一個變量
assign: 用于非指針變量设江。用于基礎(chǔ)數(shù)據(jù)類型
copy :它指出锦茁,在賦值時使用傳入值的一份拷貝
strong:強引用,引用計數(shù)器加一叉存,對象釋放時減一
weak: 弱引用码俩,不會加一減一
dealloc,release,autorelease的區(qū)別是什么?簡述他們是如何工作的歼捏?
release是引用計數(shù)器減一dealloc是引用計數(shù)器為0時調(diào)用銷毀對象Autorelease實際上只是把對release的調(diào)用延遲了稿存,對于每一個Autorelease,系統(tǒng)只是把該Object放入了當前的Autorelease pool中瞳秽,當該pool被釋放時瓣履,該pool中的所有Object會被調(diào)用Release。 autorelease pool來避免頻繁申請/釋放內(nèi)存(就是pool的作用了)练俐。
簡述一下delegate 袖迎,KVO,NSNotification的作用和區(qū)別腺晾? 解釋一下什么是Lazy Loading燕锥?
懶加載,當要使用這個對象時調(diào)用悯蝉,不使用就不會調(diào)用脯宿。節(jié)省內(nèi)存。當加載大文件時就不建議使用泉粉,以空間換時間。
為什么說Objective-C是動態(tài)運行時語言榴芳? 簡述IOS實現(xiàn)多線程有幾種方式嗡靡?多線程之間如何通訊?
GCD ,NSOperation,NSThread,PThread分為同步異步
你經(jīng)常使用類NSObject的哪些方法窟感?RunLoop是什么讨彼,在iOS中起到什麼作用? 為什么很多內(nèi)置類如UITableViewControl的delegate屬性都是assign而不retain柿祈?防止重復加載請問下面這段代碼有什么問題哈误?
(void)setAge:(int)newAge { Self.age=newAge; }
進入循環(huán) self.age 會自動觸發(fā)setter方法_age = newAge;
請使用OC編寫Singleton設計模式的實現(xiàn)哩至。
@interface Singleton : NSObject
+ (id)shardSingleton;
@end
static Singleton *_singleton = nil;
+ (id)shardSingleton {
if(!_singleton) {
_singleton = [[Singleton alloc] init];
}
return _singleton;
}
1.可變 數(shù)組用 copy會怎么樣?
copy是深拷貝蜜自,又稱為值拷貝菩貌,用copy修飾的可變數(shù)組 array會變成不可變
字符串 用strong會怎么樣?
strong是淺拷貝重荠,又稱為指針拷貝箭阶,修飾的全局NSString類型,但在局部創(chuàng)建NSMutableString時
例如NSMutableString * str = 【NSMutableString stringWhitFomt:“456”】戈鲁;
讓string = str; 當NSMutableString的str改變時仇参, strong修飾的NSString也跟著改變
用的同一個內(nèi)存
2.oc-js 直接用原生的
js -> oc
先搭建一個橋梁stringByEvaluatingJavaScripFromString
shouldStarloadwiht什么來著我忘了
js調(diào)用oc方法,可以通過data 給oc傳值
3.用charler抓包 用postMan模擬請求婆殿,
用wkwebview替代uiwebview诈乒,u或者在webviewDidFinishload中
加上[NSUserDefaules standerdUserDefaules]setInteger:0 forkey:“WebkitCacheModlePe..."]
請求方法URI協(xié)議/版本
請求頭(Request Header)
請求正文
4.block 傳值很方便,block適合兩個控制器直接的關(guān)系婆芦,代理適合多個控制器傳值傳方法怕磨,遵從協(xié)議實現(xiàn)協(xié)議方法
5.通知和kvo的區(qū)別
通知需要 被觀察者 先主動發(fā)送通知,然后觀察者注冊監(jiān)聽后才會做出響應寞缝。不過不僅可以監(jiān)聽屬性的變化癌压,還有方法,
kvo 在觀察者里實現(xiàn)荆陆,是誰監(jiān)聽誰注冊滩届,被觀察者只需要allobserver 來添加觀察。然后不需要寫任何代碼被啼, 觀察者自己來實現(xiàn) 代理方法即可帜消,
6.performSelector 延遲方法,只能在主線程中使用浓体,
因為在主線程中 當事件開始的時候 runloop回創(chuàng)建一個timer 泡挺,而子線程不會創(chuàng)建 所以無法執(zhí)行performSelector 的延遲方法,就是不能再異步中執(zhí)行命浴。
dispach_time可以 在異步中執(zhí)行 娄猫,使用dispach——after..
7.數(shù)據(jù)緩存方面的經(jīng)驗?
歸檔 NSUserDefaules sqlits FMDB NSURLCache
8.block循環(huán)引用生闲,在block中用set方法調(diào)用全局變量 比如 self.name 會讓name的引用計數(shù)計數(shù)+1媳溺,只要__weak把self重新引用一下就行了
9.類別,類別的作用 1: 將類的實現(xiàn)分散不同的類或者框架中
2: 將類的私有方法的優(yōu)先級提高
3.創(chuàng)建協(xié)議
類別通常用來添加方法碍讯,添加屬性的話 需要用到 runtime 在類別中重寫set和get方法
【只能擴展類的方法悬蔽,不能擴展類的屬性】
10。例如 邊里第三方SDK的私有API啦 用class_Ivar動態(tài)添加成員變量啦