iOS 面試題 2

一、         描述應用程序的啓動順序。
一、程序入口main函數建立UIApplication實例和UIApplication代理實例
二、在UIApplication代理實例中重寫啓動方法,設置第一ViewController
三、在第一ViewController中添加控件,實現對應的程序界面。ios

2.爲何不少內置類如UITableViewControl的delegate屬性都是assign而不是retain?請舉例說明。
防止循環引用,
Student * str=[];objective-c

Teacher *teacher=[[Teacher alloc] init];數據庫

Student * student=[[Student alloc] init];json

teacher.delegate=student;設計模式

student.delegate= teacher;緩存

在teacher中dealloc會release當前的Delegate,就會觸發student對象release,繼而也會致使student執行dealloc,在student中也會release本身的delegate,產生循環了。網絡

三、         使用UITableView時候必需要實現的幾種方法?
2個。
-(NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section;這個方法返回每一個分區的行數
-(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath)indexPath;這個方法返回咱們調用的每個單元格框架

四、         寫一個便利構造器。模塊化

+(id)leftModelWith{函數

leftModel * model = [self alloc]init];

return model;

}

五、         UIImage初始化一張圖片有幾種方法?簡述各自的優缺點。
3種,

imageNamed:系統會先檢查系統緩存中是否有該名字的image,若是有的話,則直接返回,若是沒有,則先加載圖像到緩存,而後再返回.

initWithContentsOfFile:系統不會檢查緩存,而直接從文件系統中記載並返回.

imageWithCGImage:scale:orientation 當scale= 1的時候圖像爲原始大小,orientation指定繪製圖像的方向.

參考(http://blog.csdn.net/jerryvon/article/details/7526147#)

六、     回答person的retainCount值,並解釋爲何

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

self.person = per;

1或者2.看person是什麼類型修飾的.

alloc+1,assign+0,retain+1.

七、         這段代碼有什麼問題嗎:

@implementation Person

- (void)setAge:(int)newAge {

self.age = newAge;

}

@end
死循環

八、         這段代碼有什麼問題,如何修改

for (int i = 0; i < someLargeNumber; i++) {

NSString *string = @」Abc」;

string = [string lowercaseString];

string = [string stringByAppendingString:@"xyz"];

NSLog(@「%@」, string);

}

若是數字很大的話會形成內存一直增長(由於一直經過便利構造器方法建立autorelease對象),直到循環結束才減小,在循環內加一個自動釋放池,更改後代碼以下:

for (int i = 0; i < someLargeNumber; i++) {

NSString *string = @」Abc」;
@autoreleasepool {

      string = [string lowercaseString];

      string = [string stringByAppendingString:@"xyz"];

      NSLog(@「%@」, string);

 

}

}

 

九、         截取字符串」20 | http://www.baidu.com」中,」|」字符前面和後面的數據,分別輸出它們。
NSString *string = @」 20 | http://www.baidu.com」;
[string componentsSeparatedByString:@」|」];

十、         用obj-c寫一個冒泡排序

  1.  NSMutableArray *array = [NSMutableArray arrayWithArray:@[@"3",@"1",@"10",@"5",@"2",@"7",@"12",@"4",@"8"]];

    NSString  *tmp;

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

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

            if ([[array objectAtIndex:j] integerValue] > [[array objectAtIndex:j + 1] integerValue]) {

                tmp = [array objectAtIndex:j];

                [array replaceObjectAtIndex:j withObject:[array objectAtIndex:j + 1]];

                [array replaceObjectAtIndex:j + 1 withObject:tmp];

            }

        }

    }

 ||

2.

NSMutableArray *ary = [@[@"1", @"2", @"3", @"4", @"6", @"5"] mutableCopy];

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

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

    if ([ary[j] integerValue] < [ary[j + 1] integerValue]) {

    [ary exchangeObjectAtIndex:j withObjectAtIndex:j + 1];

    }

  }

}

NSLog(@"%@", ary);

 

十一、         簡述你對UIView、UIWindow和CALayer的理解

UIWindow是應用的窗口,繼承於UIResponder.一個程序只有一個主window,能夠有多個window.

UIView繼承於UIResponder, UIResponder繼承於NSObject,是建立窗口中的一個視圖,能夠響應交互事件.

CALayer繼承於NSObject,因此CALayer不能響應事件,CALayer是用來繪製內容的,對內容進行動畫處理依賴於UIView來進行顯示,一個view可有多個圖層

十二、         寫一個完整的代理,包括聲明,實現

代理:遵照協議的對象.

@class MyView;

第一步:指定協議:(協議名:類名+Delegate)

@protocol MyViewDelegate <NSObject>

@required

-(void)changeViewBackgroudColor:(MyView *)view;

@optional

-(void)test;

@end

@interface MyView : UIView

第二步:指定代理

@property (nonatomic,assign)id<MyView> delegate;

@end

第三步:代理遵循協議.

第四步:代理實現協議裏面的必須實現的方法和其餘可選方法.

第五步:委託方通知代理開始執行方法.

1三、         分析json、xml的區別?json、xml解析方式的底層是如何處理的?

Json:鍵值對.數據小,不復雜.便於解析,有框架支持,適合輕量級傳輸.做爲數據包個數傳輸的時候效率更高.

xml:標籤套內容.xml數據量較大,比較複雜.適合大數據量的傳輸.解析方式有兩種,DOM和SAX,DOM須要讀入整個XML文檔(文檔驅動),SAX是事件驅動的,並不須要讀入整個文檔,文檔的讀入過程也就是SAX的解析過程。

1四、         ViewController 的 didReceiveMemoryWarning 是在何時被調用的?默認的操做是什麼?

1.當應用程序的內存使用接近系統的最大內存使用時,應用會向系統發送內存警告,這時候系統會調用方法向全部ViewController發送內存警告.

2.打開系統相機.

3.加載高清圖片.

默認操做:把裏面沒有用的對象進行釋放.

1五、         面向對象的三大特徵,並做簡單的介紹

封裝、繼承、多態。

封裝:代碼模塊化,方便之後調用.

繼承:子類繼承父類的全部方法和屬性.

多態:父類指針指向子類對象.

1六、         重寫一個NSStrng類型的,retain方式聲明name屬性的setter和getter方法

屬性的三大特性:語義特性,原子特性,讀寫特性.

同時重寫setter和getter方法,@synchronized name = _name,關聯屬性和實例變量.

- (void)setName:(NSString *)name{

if(_name != name){

[_name retain];

[_name release];

_name = name;

}

}

- (NSString *)name{

return [[_name retain]autorelease];

}

1七、         簡述NotificationCenter、KVC、KVO、Delegate?並說明它們之間的區別?

NotificationCenter:消息中心.消息通知.

KVC:利用鍵-值間接訪問類中的某個屬性.而不是經過調用getter和setter方法訪問。

[self setValue:@"123" forKeyPath:@"name"];

NSLog(@"%@",[self valueForKeyPath:@"name"]);

KVO:利用鍵-路徑間接訪問類中的某個屬性,也就是觀察者模式(KVO+通知中心).觀測指定對象的屬性,當指定對象的屬性更改以後會通知相應的觀察者。

Delegate:用於多個類之間的傳值.delegate遵循某個協議並實現協議聲明的方法。

1八、         What is lazy loading?
懶加載,在使用的時候纔去初始化,好比UITableViewCell的imageView屬性,懶加載對象的建立是在setter方法裏面進行建立的。

1九、         什麼是Protocol?什麼是代理?寫一個委託的interface?委託的property聲明用什麼屬性?爲何?
協議提供了一組方法,可是並不負責實現,若是一個類遵循了某個協議,而且實現了協議裏面的方法,那麼咱們稱這個類就是遵循了某個協議的代理。屬性的聲明使用assign,防止出現循環引用的問題。

20、     分別描述類別(categories)和延展(extensions)是什麼?以及二者的區別?繼承和類別在實現中有何區別?爲何Category只能爲對象添加方法,卻不能添加成員變量?
category類目:在不知道源碼的狀況下爲一個類擴展方法,extension:爲一個類聲明私有方法和變量。
繼承是建立了一個新的類,而類別只是對類的一個擴展,仍是以前的類。
類目的做用就是爲已知的類添加方法。

2一、         Objective-C有私有方法麼?私有變量呢?如多沒有的話,有沒有什麼代替的方法?
objective-c – 類裏面的方法只有兩種, 靜態方法和實例方法. 
@private來修飾私有變量
OC中全部的實例變量默認都是私有的,全部的實例方法默認都是公有的。

2二、         #import、#include和@class有什麼區別
#include c語言中引入一個頭文件,可是可能出現交叉編譯
#import在OC中引入本身建立的頭文件#import」」或者系統框架#import<>。#import不會出現交叉編譯
@class對一個類進行聲明,告訴編譯器有這個類,可是類的定義什麼的都不知道

2三、         談談你對MVC的理解?爲何要用MVC?在Cocoa中MVC是怎麼實現的?你還熟悉其餘的OC設計模式或別的設計模式嗎?

MVC是Model-VIew-Controller,就是模型-視圖-控制器, MVC把軟件系統分爲三個部分:Model,View,Controller。
高類聚,低耦合,提升代碼的複用性.
在cocoa中,你的程序中的每個object(對象)都將明顯地僅屬於這三部分中的一個,而徹底不屬於另外兩個。。
單例模式,delegate設計模式,target-action設計模式

2四、         如監測系統鍵盤的彈出

通知.

[[NSNotificationCenter defaultCenter]addObserver:self   selector:@selector()  name:UIKeyboardWillShowNotification  object:nil];

2五、         舉出5個以上你所熟悉的ios  sdk庫有哪些和第三方庫有哪些?

系統庫:UIKit框架:負責應用程序的圖形及事件驅動的關鍵基礎,如:用戶界面管理,圖形和窗口支持.

Mapkit框架:地圖.

Message UI框架:電子郵件

AV Foundation框架:可用於音頻播放.

OpenAL框架:用於播放,可播放高質,高性能的網絡音頻

Core Data框架:將數據存儲在SQLite數據庫.

Core Media框架:播放視頻.

第三方:SDWebImage :簡化圖片處理

ShareSDK    分享

SVProgressHUD   輕量級菊花

AFNetworkin  方便網絡開發

FreeStreamer  播放音頻

2六、         如何將產品進行多語言發佈?
程序的國際化

2七、         如何將敏感字變成**
字符串替換stringByReplacingOccurrencesOfString:  withString:

2八、         objc中的減號與加號表明什麼?
+靜態方法,也叫類方法,-實例方法

2九、         單例目的是什麼,並寫出一個?
當一個類只能有一個實例的時候須要使用單例。

static SortDetailsModelDown * single = nil;

+(SortDetailsModelDown *)shareSortDetailsModelDown{

@synchronized(self){

if (!single) {

single = [[SortDetailsModelDown alloc]init];

}

}

return single;

}

30、     說說響應鏈
當事件發生的時候,響應鏈首先被髮送給第一個響應者(每每是事件發生的視圖,也就是用戶觸摸屏幕的地方)。事件將沿着響應者鏈一直向下傳遞,直到被接受並做出處理。通常來講,第一響應這是個視圖對象或者其子類,當其被觸摸後事件就交由它處理,若是他不處理,時間就會被傳遞給視圖控制器對象UIViewController(若是存在),而後是它的父視圖對象(superview),以此類推直到頂層視圖。接下來會沿着頂層視圖(top view)到窗口(UIwindow 對象) 再到程序的(UIApplication對象),若是整個過程都沒有響應這個事件,則該事件被丟棄,通常狀況下,在響應鏈中只要有對象處理事件,事件就會被傳遞

         典型的響應路線圖如:       First  Responser --> The Window -->The Applicationn --> App Delegate

相關文章
相關標籤/搜索