[轉載]iOS面試題總

轉載自:http://blog.sina.com.cn/s/blog_67eb608b0101r6xb.html

 

  (2014-06-13 20:23:33)
標籤: 

轉載

 
crash
原文地址: iOS面試題總 做者: 惟一的弟子
1.簡述OC中內存管理機制。與retain配對使用的方法是dealloc仍是release,爲何?須要與alloc配對使用的方法是dealloc仍是release,爲何?readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak屬性的做用?
 
答:OC中內存管理機制應該就是引用計數的增減吧,retainCount爲0時釋放該內存。
      retain對應的是release,內存的釋放用release。
      alloc對應的是dealloc,內存的銷燬用dealloc。
      readwrite此標記說明屬性會被當成讀寫的,這也是默認屬性。
      readonly此標記說明屬性只能夠讀,也就是不能設置,能夠獲取。
      assign不會使引用計數加1,也就是直接賦值。
      retain會使引用計數加1。
      copy創建一個索引計數爲1的對象,在賦值時使用傳入值的一份拷貝。
      nonatomic:非原子性訪問,多線程併發訪問會提升性能。
      atomic:原子性訪問。
      strong:打開ARC時纔會使用,至關於retain。
      weak:打開ARC時纔會使用,至關於assign,能夠把對應的指針變量置爲nil。
 
2.類變量的@protected,@private,@public,@package,聲明各有什麼含義?
 
:@protected 該類和全部子類中的方法能夠直接訪問這樣的變量。
      @private 該類中的方法能夠訪問,子類不能夠訪問。
      @public   能夠被全部的類訪問
      @package 本包內使用,跨包不能夠
 
3.線程是什麼?進程是什麼?兩者有什麼區別和聯繫?
 
答: 線程,有時稱爲輕量級進程,是被系統獨立調度和CPU的基本運行單位。
       進程是操做系統中能夠並行工做的基本單位。
      一個應用程序裏至少有一個進程,一個進程裏至少有一個線程。
   
4.談談你對多線程開發的理解?iOS中有幾種實現多線程的方法?
 
答:在一個進程中有多個線程,每一個線程有本身單獨的任務
優勢效率快   缺點不安全,耗費資源
      有三種
      第一種,使用@synchronized(self)
      第二種,使用GCD
      第三種,使用NSOperationQueue
 
5.線程同步和異步的區別?IOS中如何實現多線程的同步?
 
答: 一個進程啓動的多個不相干線程,它們相互之間關係爲異步。
      同步的話指的是多線程同時操做一個數據 這個時候須要對數據添加保護 這個保護就是線程的同步。
       用GCD中的串行隊列來解釋多線程的同步,也就是隊列中的任務爲串行,它們各自對相鄰的任務有依賴性,若是任務1不完成,那麼任務2就不會開始,這就是同步

6.假設有一個字符串aabcad,請寫一段程序,去掉字符串中不相鄰的重複字符串,既上述字符串處理以後的輸出結果爲:aabcd
答:
NSMutableString *str = [[NSMutableString alloc]initWithFormat:@"aabcad"];

NSMutableArray *marry = [[NSMutableArray alloc]init];

    for (int i = 0; i < str.length - 1; i++) {html

        unsigned char a = [str characterAtIndex:i];ios

        for (int j = i + 1; j < str.length; j++) {面試

            unsigned char b = [str characterAtIndex:j];數據庫

            if (a == b) {json

                if (j == i + 1) {設計模式

 

                }else{數組

   

               [marry addObject:[NSString stringWithFormat:@"%d",j]];緩存

                }安全

            }性能優化

        }

        }

for (int i = marry.count - 1; i > 0; i--) {

        

        NSInteger num = [[marry objectAtIndex:i]intValue];

        [str deleteCharactersInRange:NSMakeRange(num, 1)];

 

    }

 

7.獲取一臺設備惟一標示的方法有哪些?
答:1.UDID
      2.UUID
      3.MAC ADDRESS 
        4.OPEN UDID  
 5.廣告標識符    
        6.Vindor標示符
ios7以後用的時keychain(鑰匙串)
8.ios類是否能夠多繼承?若是沒有,那能夠用其餘方法實現嗎?簡述實現過程。
答:沒有    用catogory、extension來實現   實現過程我會在ios複習中提到
9.堆和棧的區別?
答:堆須要用戶手動釋放內存,而棧則是編譯器自動釋放內存

10.ios本地數據存儲都有哪幾種方式?
答:1.  NSKeyedArchiver(加密形式)    
       2.  NSUserDefaults
       3.  Write寫入方式
       4.  SQLite3
11.寫出方法獲取ios內存使用狀況。
答:
12.深拷貝和淺拷貝的理解?
答:對一個實例進行深拷貝時當前類須要實現NSCopying協議。
       淺拷貝是複製出來一個跟原對象是同一地址的對象,而深拷貝則是複製出來一個跟源對象不一樣地址的對象,改變原對象,對新對象沒有影響。
13.怎樣實現一個singleton的類。
答:單例  在複習中也有提到
14.什麼是安全釋放?
答:把對象指針置爲nil,再對其釋放。

15.RunLoop是什麼?
答:
16.什麼是序列化和反序列化,能夠用來作什麼?如何在OC中實現複雜對象的存儲?
答:把對象轉換爲字節序列的過程稱爲對象的序列化 
        把字節序列恢復爲對象的過程稱爲對象的反序列化
       將對象寫到文件或者數據庫裏,而且能夠讀取出來
    遵循NSCoding協議,來實現複雜對象的存儲
    實現該協議後就能夠對其進行打包或者解包,而後轉化爲NSData
17.寫一個標準宏MIN,這個宏輸入兩個參數並返回較小的一個?
答:#define MIN((A),(B)) ((A(A:B))

延展問題:寫宏的時候要注意些什麼問題呢?
函數宏後面的參數都要用括號單獨括起來,函數名大寫
#define A 20
18.iphone os 有沒有垃圾回收機制?簡單闡述一下OC內存管理。
答:沒有垃圾回收 內存管理同1題
19.簡述應用程序按Home鍵進入後臺時的生命週期,以及從後臺回到前臺時的生命週期?
答:前者進行的方法有
- (void)applicationWillResignActive:(UIApplication *)application
     - (void)applicationDidEnterBackground:(UIApplication *)application
      後者進行的方法有
      - (void)applicationWillEnterForeground:(UIApplication *)application
     - (void)applicationWillResignActive:(UIApplication *)application
20.ViewController 的 alloc,loadView,ViewDidLoad,ViewWillAppear,ViewDidUnload,dealloc,init分別是在何時調用的?在自定義ViewController的時候這幾個函數裏面應該作什麼工做?
答:alloc申請內存時調用
     loadView加載視圖時調用
     ViewDidLoad視圖已經加載後調用
     ViewWillAppear視圖將要出現時調用
     ViewDidUnload視圖已經加載但沒有加載出來調用
     dealloc銷燬該視圖時調用
     init視圖初始化時候調用     
21.描述應用程序的啓動順序。
答:
1. 程序入口main函數建立UIApplication實例和UIApplication代理實例。

2. 在UIApplication代理實例中重寫啓動方法,設置根ViewController。

3. 在第一ViewController中添加控件,實現應用程序界面。

22.爲何不少內置類如UITableViewControl的delegate屬性都是assign而不是retain?請舉例說明。
答:
避免循環引用    
好比:對象A建立並引用到了對象B,對象B建立並引用到了對象C,對象C建立並引用到了對象B,這個時候B的引用計數是2,而C的引用計數是1,當A不用B的時候,就釋放了B的全部權,這個時候C還引用對象B,全部B不會釋放,引用計數爲1;由於B也引用着對象C,B不釋放,那麼C就不會被釋放,全部它們的引用計數都爲1,而且永遠不會被釋放,因此造成了循環引用。
23.使用UITableView時候必需要實現的幾種方法?
答:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
24.寫一個便利構造器。
答:
- (id)studentWithName:(NSString *)name andAge:(NSInter)age{
   MyView *view = [[MyView alloc]initWithName:name andAge:age];
   return [view autorelease];
}
25.UIImage初始化一張圖片有幾種方法?簡述各自的優缺點。
答:
3種
imageNamed:系統會先檢查系統緩存中是否有該名字的Image,若是有的話,則直接返回,若是沒有,則先加載圖像到緩存,而後再返回。
initWithContentsOfFile:系統不會檢查系統緩存,而直接從文件系統中加載並返回。
imageWithCGImage:scale:orientation 當scale=1的時候圖像爲原始大小,orientation制定繪製圖像的方向。
1.回答person的retainCount值,並解釋爲何?


Person *per = [[Person alloc]init];


self.person = per;
答:1或者2,alloc+1,assign+0,retain+1

2.這段代碼有什麼問題嗎?
@implementation Person
-(void)setAge:(int)newAge{self.age = newAge;}

@end
 
答:死循環
 
3.這段代碼有什麼問題,如何修改
for(int i = 0;i
NSString *string = @"Abc";
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@"%@",string);
}
答:在循環里加入自動釋放池@autoreleasepool{};
 
4.截取字符串"20 | http://www.baidu.com"中,"|"字符前面和後面的數據,分別輸出它們。
答:[string componentsSeparatedByString:@"|"]
 
5.用obj-c寫一個冒泡程序。
答:

    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"15",@"12",@"5",@"8", nil];

    for (int i = 0; i < array.count - 1; i++) {

        int a = [array[i]intValue];

        for (int j = i + 1; j < array.count; j++) {

            int b = [array[j]intValue];

            if (a < b) {

                [array exchangeObjectAtIndex:i withObjectAtIndex:j];

            }

        }

    }

    for (int i = 0; i < array.count; i++) {

        NSLog(@"%@",array[i]);

    }

 
 
6.簡述你對UIView,UIWindow和CALayer的理解。
答:UIWindow是應用的窗口
      UIView是建立窗口中的一個視圖,能夠響應交互事件
      CALayer不能夠響應事件
 
7.寫一個完整的代理,包括聲明,實現。
答:在具體問題模塊會單獨介紹
 
8.分析json、xml的區別?json、xml解析方式的底層是如何處理的?
答:json數據小,易解析,不復雜    xml數據較大,比較複雜
      json中以key/value形式保存,大多數是字典數組模式
      xml中則是<>
 
9.ViewController的didReceiveMemoryWarning是在何時被調用的?默認的操做是什麼?
答:當應用程序的內存使用接近系統的最大內存使用時,應用會向系統發送內存警告,這時候系統會調用方法向全部的ViewController發送內存警告
 
10.面向對象的三大特徵,並做簡單的介紹。
答:封裝、繼承、多態
封裝:將一個實例的全部屬性封裝到某個類中
繼承:子類繼承父類全部方法和屬性
多態:父類指針指向子類對象
 
11.重寫一個NSString類型的,retain方式聲明name屬性的setter和getter方法。
答:
- (void)setName:(NSString *)name{
   if(_name != name){
[_name retain];
[_name release];
_name = name;
}
}
- (NSString *)name{
return [[_name retain]autorelease];
}
 
12.簡述NotificationCenter、KVC、KVO、Delegate?並說明它們之間的區別?
答:消息中心,消息通知;
      利用鍵-值間接訪問類中的某個屬性
      利用鍵-路徑間接訪問類中的某個屬性,也稱觀察者模式
      代理,多用於兩個類之間的傳值
       區別:
 
13.what is lazy loading?
答:延時加載,按需加載。
 
14.什麼是Protocol?什麼是代理?寫一個委託的interface?委託的property聲明用什麼屬性?爲何?
答:協議,用來在兩個ViewController交互時所定的協議。
      代理,第三方中介。
      @protocol PersonDelegate NSObject
      - (void)setNum;
      @end
      @property (nonatomic,assign) iddelegate;
      防止循環引用
 
15.分別描述類目(categories)和延展(extensions)是什麼?以及二者的區別?繼承和類目的實現中有何區別?爲何Category只能爲對象添加方法,卻不能添加成員變量?
答:extensions能夠聲明屬性   不用實現方法;
      category能夠爲當前類生成私有方法,子類不能直接調用;
      可是經過繼承,子類能夠調用父類全部的屬性和方法;
       回頭補上
 
16.Objective-C 有私有方法嗎?私有變量呢?若是沒有的話,有沒有什麼代替的方法?
答:沒有私有方法,有私有變量
      私有方法能夠用 category 和 extension 來代替
 
17.#import、#include和@class有什麼區別
答:有時間補
 
18.談談你對MVC的理解?爲何要用MVC?在Cocoa中MVC是怎麼實現的?你還熟悉其餘的OC設計模式或別的設計模式嗎?
答:M----model    V----view    C----controller
      MVC可讓咱們的項目框架更加清晰,同時可讓1個controller對應多個model,改代碼的時候也方便;
      Cocoa中,回頭補
      單例模式,Delegate模式,KVC模式,消息通知模式,Target/Action模式
 
19.如檢測系統鍵盤的彈出
答:[[NSNotificationCenter defaultCenter]addObserver:self  selector:@selector()  name:UIKeyboardWillShowNotification  object:nil];
 
20.舉出5個以上你所熟悉的ios sdk庫有哪些和第三方庫有哪些?
答:1.AFNetworking
      2.ASIHttpRequest
      3.shareKit
      4.FMDatebase
      5.MMDrawerController
      回頭再研究一些單獨列出來
 
21.如何將產品進行多語言發佈?
答:國際化語言改爲English
 
22.如何將敏感字變成**
答:

NSMutableArray *array = [[NSMutableArray alloc]init];//本地敏感字庫

    NSString *a = @"敏感字";//本地敏感字庫裏存的某個敏感字

    NSString *b = @"我";

    

    [array addObject:a];

    [array addObject:b];

    

    //下面是方法

    NSMutableString *s = [[NSMutableString alloc]initWithString:@"我是敏感字"];//要判斷的字符串

    for (int i = 0; i < array.count; i++) {

        NSString *minganzi = array[i];

        NSMutableString *replaceString = [[NSMutableString alloc]init];

        for (int j = 0; j < s.length - a.length + 1; j++) {

            NSRange range;

            range.length = minganzi.length;

            range.location = j;

            if ([[s substringWithRange:range] isEqualToString:minganzi]) {

                for (int k = 0; k < range.length; k++) {

                    [replaceString appendString:@"*"];

                }

                [s replaceCharactersInRange:range withString:replaceString];

            }

        }

    }

    NSLog(@"%@",s);

 
23.objc中的減號和加號表明什麼?
答:實例對象方法    類方法
 
24.單例目的是什麼,並寫出一個?
答:節省內存
      回頭用GCD寫一個
 
25.說說響應鏈
答:nextResponse   View找它的Controller
 
1.咱們說的OC時動態運行時語言是什麼意思?什麼是動態識別,動態綁定?
答:動態類型  --  id     動態綁定  --  @selector()   動態下載
 
2.分別描述內存管理要點、autorelease、release、NSAutoreleasePool?並說明autorelease是何時被release的?簡述何時由你負責釋放對象,何時不禁你釋放?[NSAutoreleasePool release] 和 [NSAutoreleasePool drain]有什麼區別?
答:
 
3.說說下面關鍵詞在內存管理的做用:alloc、init、copy、retain、release、autorelease、dealloc、retain count?
答:
 
4.drawRect和layouSubviews 的區別?
答:
 
5.http 和 scoker通訊的區別?socker鏈接相關庫,TCP,UDP的區別?
答:
 
6.什麼是鍵值、鍵路徑是什麼?
答:KVC   setValue:@"" forKey:@""
      KVO   setValue:@"" forKeyPath@""
 
7.聲明一個靜態方法和一個實例方法?
答:類方法與實例方法
+(id)personWithName:(NSString *)name{
Person *person = [[Person alloc]initWithName:name];
return [person autorelease]; 
}
- (id)initWithName:(NSString *)name{
self = [super init];
  if(self){
self.name = name;
}
return self;
}
 
8.什麼是push?遠程推送?
答:
 
9.init和initWithObject區別(語法)?
答:後者給屬性值
 
10.請寫出代碼,用block來取代上例中的protocol,並比較兩種方法的優點。實際應用部分?請寫出代碼,用blocks取代協議或回調方法。
答:int (^myBlock)(int) = ^(int a){return a;};
回頭在具體分析模塊中總結
 
11.你作iphone開發時候,有哪些傳值方式,view和view之間是如何傳值的?
答:屬性,Delegate,單例,消息通知,Block
 
12.給定的一個字符串,判斷字符串中是否含有png,有就刪除它?
答:
 
13.對於語句NSString* testObject = [[NSData alloc]init];testObject在編譯時和運行時分別是什麼類型的對象?
答:編譯時是NSString,運行時是NSData
 
14.OC中是全部對象間的交互是如何實現的?
答:消息機制
 
15.目標-動做機制
答:Target - action
 
16.for(int index = 0; index < largenumber; index++){
NSString *tempStr = @"tempStr";
NSLog(tempStr);
NSNumber *tempNumber = [NSNumber numberWithInt:2];
NSLog(tempNumber);
}
這段代碼有什麼問題?會不會形成內存泄露(多線程)?在內存緊張的設備上作大循環時自動釋放池是寫在循環內好仍是循環外號?爲何?
答:
 
17.描述上拉加載、下拉刷新的實現機制?
答:
 
18.什麼是沙盒?沙盒包含哪些文件,描述每一個文件的使用場景。如何獲取這些文件的路徑?如何獲取應用程序包中文件的路徑?
答:保護程序安全性
      Documents
      library
      tmp
 
19.介紹一下XMPP?有什麼優缺點?
答:回頭嘗試
 
20.談談對性能優化的見解,如何作?
答:根據用戶的需求作優化
 
21.應用程序如何省電?
答:先關閉全部跟網絡有關的選項,代碼裏回頭補
 
22.寫一個遞歸方法:計算N的階乘,而後將計算結果進行存儲。以便應用退出後下次啓動可直接獲取該值。
答:
@property (nonatomic,assign) int sum;
在初始化方法中初始_sum = 1;
- (int)cheng:(int)n{
if(n != 1){
_sum = _sum * n;
n--;
[self cheng:n];
}else{
[[NSUserDefaults standerUserDefaults]setObject: [NSString stringWithFormat:@"%d",_sum] forKey:@"cheng"];
}
}
 
23.NSArray 和 NSMutableArray 的區別,多線程操做哪一個更安全?
答:不可變數組更安全
 
24.當前有一個數組,裏面有若干重複的數據,如何去除重複的數據?(會幾個寫幾個)
答:1,2,3,4,5,6,7,8,9,10 ………… 99,100
將數組中全部數字去出來,存到新數組下標爲對應數字的位置
 
25.isKindOfClass、isMemberOfClass 做用分別是什麼?
答:前者判斷是否屬於該類及該類祖宗類,後者只判斷是否屬於該類
 
26.寫出下面程序段的輸出結果
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"a string value" forKey:@"akey"];
NSLog(@"%@",[dict objectForKey:@"akey"]);
[dict release];
答:崩潰
 
27.請寫出如下代碼的執行結果
NSString *name = [[NSString alloc]init];
name = @"Habb";
[name release];
答:申請內存沒有用到
 
28.請分別寫出SEL、id的意思?
答:動態綁定方法   動態類型
 
29.iPhone上,不能被應用程序直接調用的系統程序是什麼?
答:
 
30.以.mm爲拓展名的文件裏,能夠包含的代碼有哪些?c和obj-c如何混用?
答:C、Object-C、C++
 
31.說說如何進行後臺運行程序?
答:
 
32.sizeof 和 strlen 的區別和聯繫?
答:前者算內存    後者判斷字符串長度
 
33.sprintf,strcpy,memcpy的功能?使用上要由哪些要注意的地方。
答:sprintf:將某類型轉換成字符串類型
strcpy:拷貝某字符串,長度要相等,考慮'/0'
memcpy:拷貝內存
 
34.本身寫函數,實現strlen功能。
答:

int sl(const char *s)

{

    int length = 0;

    while (*s!='') { 

        s++;

        length++;

    }

    return length;

}

 
35.寫一個代碼片斷輸入一個字符串「20130322152832」,輸出一個NSDate類型的對象、打印該對象輸出 2013-03-22 15:28:32
答:
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"yyyy-MM-dd:HH-mm-ss"];
NSLog(@"%@",[formatter stringWithDate:[NSDate date]);
 
36.找錯誤
a: void test1()
{
char string[10];
char *str1 = "0123456789";
加個'/0'
strcpy(string,str1);
}
 
b:void GetMemory(char **p,int num)
{
*p = (char *)malloc(num);
}
 
void Test(void)
{
char *str = NULL;
GetMemory(&str,100);
strcpy(str,"hello");
printf(str);
}
 
37.用變量a寫出如下定義
a、一個整型數
b、一個指向整型數的指針
c、一個指向指針的指針,它指向的指針是指向一個整型數
d、一個有10個整型數的數組
e、一個有10個指針的數組,該指針是指向一個整型數的
f、一個指向有10個整型數數組的指針
g、一個指向函數的指針,該函數有一個整型參數,並返回一個整型數
答:
相關文章
相關標籤/搜索