iphone面試題目
1.main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a 1);
printf("%d,%d",*(a 1),*(ptr-1));
}
答:2,5
*(a 1)就是a[1],*(ptr-1)就是a[4],執行結果是2,5
&a 1不是首地址 1,系統會(huì )認為加一個(gè)a數組的偏 移,是偏移了一個(gè)數組的大小(本例是5個(gè)int)
int *ptr=(int *)(&a 1);
則ptr實(shí)際 是&(a[5]),也就是a 5
原因如下:
&a是數組指針,其類(lèi)型為 int (*)[5];
而 指針加1要根據指針類(lèi)型加上一定的值,不同類(lèi)型的指針 1之后增加的大小不同。
a是長(cháng)度為5的int數組指針,所以要加 5*sizeof(int)
所以ptr實(shí)際是a[5]
但是prt與(&a 1)類(lèi)型是不一樣的(這點(diǎn)很重要)
所以prt-1只會(huì )減去sizeof(int*)
a,&a的地址是一樣的,但意思不一樣
a是數組首地址,也就是a[0]的地址,&a是對象(數組)首地址,
a 1是數組下一元素的地址,即a[1],&a 1是下一個(gè)對象的地址,即a[5].
2. 以下為Windows NT下的32位C 程序,請計算sizeof的值
void Func ( char str[100] )
{
sizeof( str ) = ?
}
void *p = malloc( 100 );
sizeof ( p ) = ?
這題 很常見(jiàn)了,Func ( char str[100] )函數中數組名作為函數形參時(shí),在函數體內,數組名失去了本身的內涵,僅僅只是一個(gè)指針;在失去其內涵的同時(shí),它還失去了其常量特性,可以作自增、自減等 操作,可以被修改。Windows NT 32位平臺下,指針的長(cháng)度(占用內存的大小)為4字節,故sizeof( str ) 、sizeof ( p ) 都為4。
3.還是考指針,不過(guò)我對cocoa的代碼還是不太熟悉
大概是這樣的
- (void)*getNSString(const NSString * inputString)
{
inputString = @"This is a main test\n";
return ;
}
-main(void)
{
NSString *a=@"Main";
NSString *aString = [NSString stringWithString:@"%@",getNSString(a)];
NSLog(@"%@\n", aString);
}
最后問(wèn)輸出的字符串:NULL,output在 函數返回后,內存已經(jīng)被釋放。
4.用預處理指令#define聲明一個(gè)常數,用以表明1年中有多少秒(忽略閏年問(wèn)題)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在這想看到幾件事 情:
?; #define 語(yǔ)法的基本知識(例如:不能以分號結束,括號的使用,等等)
?; 懂得預處理器將為你計算常數表達式的值,因此,直接寫(xiě)出你是如何計算一年中有多少秒而不是計算出實(shí)際的值,是更清晰而沒(méi)有代價(jià)的。
?; 意識到這個(gè)表達式將使一個(gè)16位機的整型數溢出-因此要用到長(cháng)整型符號L,告訴編譯器這個(gè)常數是的長(cháng)整型數。
?; 如果你在你的表達式中用到UL(表示無(wú)符號長(cháng)整型),那么你有了一個(gè)好的起點(diǎn)。記住,第一印象很重要。
寫(xiě)一個(gè)"
標準"宏MIN ,這個(gè)宏輸入兩個(gè)參數并返回較小的一個(gè)。
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
這
個(gè)測試是為下面的目的而設的:
?;
標識#define在宏中應用的基本知識。這是很重要的,因為直到嵌入(inline)操作符變?yōu)闃藴蔆的一部分,宏是方便產(chǎn)生嵌入代碼的唯一方
法,
對于嵌入式系統來(lái)說(shuō),為了能達到要求的性能,嵌入代碼經(jīng)常是必須的方法。
?;
三重條件操作符的知識。這個(gè)操作符存在C語(yǔ)言中的原因是它使得編譯器能產(chǎn)生比 if-then-else 更優(yōu)化的代碼,了解這個(gè)用法是很重要的。
?; 懂得在宏中小心地把參數用括號括起來(lái)
?; 我也用這個(gè)問(wèn)題開(kāi)始討論宏的副作用,例如:當你寫(xiě)下面的代碼時(shí)會(huì )發(fā)生什么事?
least = MIN(*p , b);
結果是:
((*p ) <= (b) ? (*p ) : (*p ))
這個(gè)表達式會(huì )產(chǎn)生副作用,指針p會(huì )作三次 自增操作。
5.寫(xiě)一個(gè)委托的 interface
@protocol MyDelegate;
@interface MyClass: NSObject
{
id
}
// 委托方法
@protocol MyDelegate
- (void)didJobs:(NSArray *)args;
@end
6. 寫(xiě)一個(gè)NSString類(lèi)的實(shí)現
(id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
(id) stringWithCString: (const char*)nullTerminatedCString
encoding: (NSStringEncoding)encoding
{
NSString *obj;
obj = [self allocWithZone: NSDefaultMallocZone()];
obj = [obj initWithCString: nullTerminatedCString encoding: encoding];
return AUTORELEASE(obj);
}
7.obj-c有多重繼承么?不是的話(huà)有什么替代方法?
cocoa 中所有的類(lèi)都是NSObject 的子類(lèi)
多繼承在這里是用protocol 委托代理 來(lái)實(shí)現的
你不用去考慮繁瑣的多繼承 ,虛基類(lèi)的概念.
ood的多態(tài)特性 在 obj-c 中通過(guò)委托來(lái)實(shí)現.
8.obj-c有私有方法么?私有變量呢
objective-c - 類(lèi)里面的方法只有兩種, 靜態(tài)方法和實(shí)例方法. 這似乎就不是完整的面向對象了,按照OO的原則就是一個(gè)對象只暴露有用的東西. 如果沒(méi)有了私有方法的話(huà), 對于一些小范圍的代碼重用就不那么順手了. 在類(lèi)里面聲名一個(gè)私有方法
@interface Controller : NSObject { NSString *something; }
(void)thisIsAStaticMethod;
- (void)thisIsAnInstanceMethod;
@end
@interface Controller (private) -
(void)thisIsAPrivateMethod;
@end
@private可以用來(lái)修飾私有變量
在Objective‐C中,所有實(shí)例變量默認都是私有的,所有實(shí)例方法默認都 是公有的
9.關(guān)鍵字const有什么含意?修飾類(lèi)呢?static的作 用,用于類(lèi)呢?還有extern c的作用
const 意味著(zhù)"只讀",下面的聲明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前兩個(gè)的作用是一樣,a是一個(gè)常整型數。第三個(gè)意味著(zhù)a是一個(gè)指向常整型數的指 針(也就是,整型數是不可修改的,但指針可以)。第四個(gè)意思a是一個(gè)指向整型數的常指針(也就是說(shuō),指針指向的整型數是可以修改的,但指針是不可修改 的)。最后一個(gè)意味著(zhù)a是一個(gè)指向常整型數的常指針(也就是說(shuō),指針指向的整型數是不可修改的,同時(shí)指針也是不可修改的)。
結論:
?; 關(guān)鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實(shí)際上,聲明一個(gè)參數為常量是為了告訴了用戶(hù)這個(gè)參數的應用目的。如果
你曾花很多 時(shí)間清理其它人留下的垃圾,你就會(huì )很快學(xué)會(huì )感謝這點(diǎn)多余的信息。(當然,懂得用const的程序員很少會(huì )留下的垃圾讓別人來(lái)清
理的。)
?; 通過(guò)給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。
?; 合理地使用關(guān)鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無(wú)意的代碼修改。簡(jiǎn)而言之,這樣可以減少bug的出現。
(1)欲阻止一個(gè)變量被改變,可以使用 const 關(guān)鍵字。在定義該 const 變量時(shí),通常需要對它進(jìn)行初
始化,因為以后就沒(méi)有機會(huì )再去改變它了;
(2)對指針來(lái)說(shuō),可以指定指針本身為 const,也可以指定指針所指的數據為 const,或二者同時(shí)指
定為 const;
(3)在一個(gè)函數聲明中,const 可以修飾形參,表明它是一個(gè)輸入參數,在函數內部不能改變其值;
(4)對于類(lèi)的成員函數,若指定其為 const 類(lèi)型,則表明其是一個(gè)常函數,不能修改類(lèi)的成員變量;
(5)對于類(lèi)的成員函數,有時(shí)候必須指定其返回值為 const 類(lèi)型,以使得其返回值不為“左值”。
關(guān)鍵字volatile有什么含意?并給出三個(gè)不同的例子。
一個(gè)定義為 volatile的變量是說(shuō)這變量可能會(huì )被意想不到地改變,這樣,編譯器就不會(huì )去假設這個(gè)變量的值了。精確地說(shuō)就是,優(yōu)化器在用到
這個(gè)變量時(shí)必須 每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個(gè)例子:
?; 并行設備的硬件寄存器(如:狀態(tài)寄存器)
?; 一個(gè)中斷服務(wù)子程序中會(huì )訪(fǎng)問(wèn)到的非自動(dòng)變量(Non-automatic variables)
?; 多線(xiàn)程應用中被幾個(gè)任務(wù)共享的變量
?; 一個(gè)參數既可以是const還可以是volatile嗎?解釋為什么。
?; 一個(gè)指針可以是volatile 嗎?解釋為什么。
下 面是答案:
?; 是的。一個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。
?; 是的。盡管這并不很常見(jiàn)。一個(gè)例子是當一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buffer的指針時(shí)。
static 關(guān)鍵字的作用:
(1)函數體內 static 變量的作用范圍為該函數體,不同于 auto 變量,該變量的內存只被分配一次,
因此其值在下次調用時(shí)仍維持上次的值;
(2)在模塊內的 static 全局變量可以被模塊內所用函數訪(fǎng)問(wèn),但不能被模塊外其它函數訪(fǎng)問(wèn);
(3)在模塊內的 static 函數只可被這一模塊內的其它函數調用,這個(gè)函數的使用范圍被限制在聲明
它的模塊內;
(4)在類(lèi)中的 static 成員變量屬于整個(gè)類(lèi)所擁有,對類(lèi)的所有對象只有一份拷貝;
(5)在類(lèi)中的 static 成員函數屬于整個(gè)類(lèi)所擁有,這個(gè)函數不接收 this 指針,因而只能訪(fǎng)問(wèn)類(lèi)的static 成員變量。
extern "C" 的作用
(1)被 extern "C"限定的函數或變量是 extern 類(lèi)型的;
extern 是 C/C 語(yǔ)言中表明函數和全局變量作用范圍(可見(jiàn)性)的關(guān)鍵字,該關(guān)鍵字告訴編譯器,
其聲明的函數和變量可以在本模塊或 其它模塊中使用。
(2)被 extern "C"修飾的變量和函數是按照 C 語(yǔ)言方式編譯和連接的;
extern "C"的慣用法
(1)在 C 中引用 C 語(yǔ)言中的函數和變量,在包含 C 語(yǔ)言頭文件(假設為 cExample.h)時(shí),需進(jìn)
行下列處理:
extern "C"
{
#include "cExample.h"
}
而在 C 語(yǔ)言的頭文件中,對其外部函數只能指定為 extern 類(lèi)型,C 語(yǔ)言中不支持 extern "C"聲明,
在.c 文件中包含了 extern "C"時(shí)會(huì )出現編譯語(yǔ)法錯誤。
(2)在 C 中引用 C 語(yǔ)言中的函數和變量時(shí),C 的頭文件需添加 extern "C",但是在 C 語(yǔ)言中不
能直接引用聲明了 extern "C"的該頭文件,應該僅將 C 文件中將 C 中定義的 extern "C"函數聲明為
extern 類(lèi)型。
10.為什么標準頭文件都有類(lèi)似以下的結構?
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif
顯然,頭文件中的編譯宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用
是防止該頭文件被重復引用。
11.#import跟#include的區別,@class呢?
@class一般用于頭文件中需要聲明該類(lèi)的某個(gè)實(shí)例變量的時(shí)候用到,在m文 件中還是需要使用#import
而#import比起#include的好處就是不會(huì )引起交叉編譯
12.MVC模式的理解
MVC設計模式考慮三種對象:模型對象、視圖對象、和控制器對象。模型對象代表 特別的知識和專(zhuān)業(yè)技能,它們負責保有應用程序的數據和定義操作數據的邏輯。視圖對象知道如何顯示應用程序的模型數據,而且可能允許用戶(hù)對其進(jìn)行編輯?刂 器對象是應用程序的視圖對象和模型對象之間的協(xié)調者。
13.線(xiàn)程與進(jìn)程的區別和聯(lián)系?
進(jìn)程和線(xiàn)程都是由操作系統所體會(huì )的程序運行的基本 單元,系統利用該基本單元實(shí)現系統對應用的并發(fā)性。
程和線(xiàn)程的主要差別在于它們是不同的操作系統資源 管理方式。進(jìn)程有獨立的地址空間,一個(gè)進(jìn)程崩潰后,在保護模式下不會(huì )對其它進(jìn)程產(chǎn)生影響,而線(xiàn)程只是一個(gè)進(jìn)程中的不同執行路徑。線(xiàn)程有自己的堆棧和局部變 量,但線(xiàn)程之間沒(méi)有單獨的地址空間,一個(gè)線(xiàn)程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線(xiàn)程的程序健壯,但在進(jìn)程切換時(shí),耗費資源較大,效率要差一 些。但對于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線(xiàn)程,不能用進(jìn)程。
14.列舉幾種進(jìn)程的同步機制,并比較其優(yōu)缺點(diǎn)。
答案: 原子操作 信號量機制 自旋鎖 管程,會(huì )合,分布式系統
進(jìn)程之間通信的途徑
答案:共享存儲系統消息傳遞系統管道:以文件系統為基礎
進(jìn) 程死鎖的原因
答案:資源競爭及進(jìn)程推進(jìn)順序非法
死鎖的4個(gè)必要條 件
答案:互斥、請求保持、不可剝奪、環(huán)路
死鎖的處理
答案:鴕鳥(niǎo)策略、預防策略、避免策略、檢測與解除死鎖
15.堆和棧的區別
管理方式:對于棧來(lái)講,是由編譯器自動(dòng)管理,無(wú)需我們手工控制;對于堆來(lái)說(shuō),釋放工作由程序員控制,容易產(chǎn)生memory leak。
申請大。
棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話(huà)的意思是棧頂的地址和棧的最大容量是系統 預先規定好的,在WINDOWS下,棧的大小是2M(也有的說(shuō)是1M,總之是一個(gè)編譯時(shí)就確定的常數),如果申請的空間超過(guò)棧的剩余空間時(shí),將提示 overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來(lái)存儲的空閑內存地 址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統中有效的虛擬內存。由此可見(jiàn),堆獲得的空間比較靈活,也比較大。
碎片問(wèn)題:對于堆來(lái)講,頻繁的new/delete勢必會(huì )造成內存空間的不連續,從而造成大量的碎片,使程序效率降低。對于棧來(lái)講,則不會(huì )存在這個(gè) 問(wèn)題,因為棧是先進(jìn)后出的隊列,他們是如此的一一對應,以至于永遠都不可能有一個(gè)內存塊從棧中間彈出
分配方式:堆都是動(dòng)態(tài)分配的,沒(méi)有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動(dòng)態(tài)分配由 alloca函數進(jìn)行分配,但是棧的動(dòng)態(tài)分配和堆是不同的,他的'動(dòng)態(tài)分配是由編譯器進(jìn)行釋放,無(wú)需我們手工實(shí)現。
分配效率:棧是機器系統提供的數據結構,計算機會(huì )在底層對棧提供支持:分配專(zhuān)門(mén)的寄存器存放棧的地址,壓棧出棧都有專(zhuān)門(mén)的指令執行,這就決定了棧的 效率比較高。堆則是C/C 函數庫提供的,它的機制是很復雜的。
16.什么是鍵-值,鍵路徑是什么
模型的性質(zhì)是通過(guò)一個(gè)簡(jiǎn)單的鍵(通常是個(gè)字符串)來(lái)指定的。視圖和控制器通過(guò)鍵 來(lái)查找相應的屬性值。在一個(gè)給定的實(shí)體中,同一個(gè)屬性的所有值具有相同的數據類(lèi)型。鍵-值編碼技術(shù)用于進(jìn)行這樣的查找—它是一種間接訪(fǎng)問(wèn)對象屬性的機制。
鍵路徑是一個(gè)由用點(diǎn)作分隔符的鍵組成的字符串,用于指定一個(gè)連接在一起的對象性 質(zhì)序列。第一個(gè)鍵的
性質(zhì)是由先前的性質(zhì)決定的,接下來(lái)每個(gè)鍵的值也是相對于其前面的性質(zhì)。鍵路徑使您可以以獨立于模型
實(shí)現的方式指定相關(guān) 對象的性質(zhì)。通過(guò)鍵路徑,您可以指定對象圖中的一個(gè)任意深度的路徑,使其指向相
關(guān)對象的特定屬性。
For example, the key path address.streetwould get the value of the address property from the receiving
object, and then determine the street property relative to the address object.
17.c和obj-c如何混用
1)obj-c的編譯器處理后綴為m的文件時(shí),可以識別obj-c和c的代碼, 處理mm文件可以識別obj-c,c,c 代碼,但cpp文件必須只能用c/c 代碼,而且cpp文件include的頭文件中,也不能出現obj- c的代碼,因為cpp只是cpp
2) 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是問(wèn)題
3)在cpp中混用obj- c其實(shí)就是使用obj-c編寫(xiě)的模塊是我們想要的。
如果模塊以類(lèi)實(shí)現,那么要按照cpp class的標準寫(xiě)類(lèi)的定義,頭文件中不能出現obj-c的東西,包括#import cocoa的。實(shí)現文件中,即類(lèi)的實(shí)現代碼中可以使用obj-c的東西,可以import,只是后綴是mm。
如果模塊以函數實(shí)現,那么頭文件要按 c的格式聲明函數,實(shí)現文件中,c 函數內部可以用obj-c,但后綴還是mm或m。
總結:只要cpp文件和cpp include的文件中不包含obj-c的東西就可以用了,cpp混用obj-c的關(guān)鍵是使用接口,而不能直接使用實(shí)現代碼,實(shí)際上cpp混用的是 obj-c編譯后的o文件,這個(gè)東西其實(shí)是無(wú)差別的,所以可以用。obj-c的編譯器支持cpp.
18.目標-動(dòng)作機制
目標是動(dòng)作消息的接收者。一個(gè)控件,或者更為常見(jiàn)的是它的單元,以插座變量(參 見(jiàn)"插座變量"部分)
的形式保有其動(dòng)作消息的目標。
動(dòng)作是控件發(fā)送給目標的消息,或者從目標的角度看,它是目標為了響應動(dòng)作而實(shí)現 的方法。
程序需要某些機制來(lái)進(jìn)行事件和指令的翻譯。這個(gè)機制就是目標-動(dòng)作機制。
19.cocoa touch框架
iPhone OS 應用程序的基礎 Cocoa Touch 框架重用了許多 Mac 系統的成熟模式,但是它更多地專(zhuān)注于觸摸的接口和優(yōu)化。UIKit 為您提供了在 iPhone OS 上實(shí)現圖形,事件驅動(dòng)程序的基本工具,其建立在和 Mac OS X 中一樣的 Foundation 框架上,包括文件處理,網(wǎng)絡(luò ),字符串操作等。
Cocoa Touch 具有和 iPhone 用戶(hù)接口一致的特殊設計。有了 UIKit,您可以使用 iPhone OS 上的獨特的圖形接口控件,按鈕,以及全屏視圖的功能,您還可以使用加速儀和多點(diǎn)觸摸手勢來(lái)控制您的應用。
各色俱全的框架 除了 UIKit 外,Cocoa Touch 包含了創(chuàng )建世界一流 iPhone 應用程序需要的所有框架,從三維圖形,到專(zhuān)業(yè)音效,甚至提供設備訪(fǎng)問(wèn) API 以控制攝像頭,或通過(guò) GPS 獲知當前位置。Cocoa Touch 既包含只需要幾行代碼就可以完成全部任務(wù)的強大的 Objective-C 框架,也在需要時(shí)提供基礎的 C 語(yǔ)言 API 來(lái)直接訪(fǎng)問(wèn)系統。這些框架包括:
Core Animation
通過(guò) Core Animation,您就可以通過(guò)一個(gè)基于組合獨立圖層的簡(jiǎn)單的編程模型來(lái)創(chuàng )建豐富的用戶(hù)體驗。
Core Audio
Core Audio 是播放,處理和錄制音頻的專(zhuān)業(yè)技術(shù),能夠輕松為您的應用程序添加強大的音頻功能。
Core Data
提供了一個(gè)面向對象的數據管理解決方案,它易于使用和理解,甚至可處理任何應用 或大或小的數據模型。
功能列表:框架分類(lèi)
下面是 Cocoa Touch 中一小部分可用的框架:
音頻和視頻
Core Audio
OpenAL
Media Library
AV Foundation
數據管理
Core Data
SQLite
圖形和動(dòng)畫(huà)
Core Animation
OpenGL ES
Quartz 2D
網(wǎng)絡(luò )/li>
Bonjour
WebKit
BSD Sockets
用戶(hù)應用
Address Book
Core Location
Map Kit
Store Kit
20.objc的內存管理
? 如果您通過(guò)分配和初始化(比如[[MyClass alloc] init])的方式來(lái)創(chuàng )建對象,您就擁
有這個(gè)對象,需要負責該對象的釋放。這個(gè)規則在使用NSObject的便利方法new 時(shí)也同樣適用。
? 如果您拷貝一個(gè)對象,您也擁有拷貝得到的對象,需要負責該對象的釋放。
? 如果您保持一個(gè)對象,您就部分擁有這個(gè)對象,需要在不再使用時(shí)釋放該對象。
反過(guò)來(lái),
? 如果您從其它對象那里接收到一個(gè)對象,則您不擁有該對象,也不應該釋放它(這個(gè)規則有少數
的例外,在參考文檔中有顯式的說(shuō)明)。
21.自動(dòng)釋放池是什么,如何工作
當您向一個(gè)對象發(fā)送一個(gè)autorelease消息時(shí),Cocoa就會(huì )將該對 象的一個(gè)引用放入到最新的自動(dòng)釋放池。它仍然是個(gè)正當的對象,因此自動(dòng)釋放池定義的作用域內的其它對象可以向它發(fā)送消息。當程序執行到作用域結束的位置 時(shí),自動(dòng)釋放池就會(huì )被釋放,池中的所有對象也就被釋放。
1. ojc-c 是通過(guò)一種"referring counting"(引用計數)的方式來(lái)管理內存的, 對象在開(kāi)始分配內存(alloc)的時(shí)候引用計數為一,以后每當碰到有copy,retain的時(shí)候引用計數都會(huì )加一, 每當碰到release和autorelease的時(shí)候引用計數就會(huì )減一,如果此對象的計數變?yōu)榱?, 就會(huì )被系統銷(xiāo)毀.
2. NSAutoreleasePool 就是用來(lái)做引用計數的管理工作的,這個(gè)東西一般不用你管的.
3. autorelease和release沒(méi)什么區別,只是引用計數減一的時(shí)機不同而已,autorelease會(huì )在對象的使用真正結束的時(shí)候才做引用計數 減一.
22.類(lèi)工廠(chǎng)方法是什么
類(lèi)工廠(chǎng)方法的實(shí)現是為了向客戶(hù)提供方便,它們將分配和初始化合在一個(gè)步驟中, 返回被創(chuàng )建的對象,并
進(jìn)行自動(dòng)釋放處理。這些方法的形式是 (type)className...(其中 className不包括任何前綴)。
工廠(chǎng)方法可能不僅僅為了方便使用。它們不但可以將分配和初始化合在一起,還可以 為初始化過(guò)程提供對
象的分配信息。
類(lèi)工廠(chǎng)方法的另一個(gè)目的是使類(lèi)(比如NSWorkspace)提供單件實(shí)例。雖 然init...方法可以確認一
個(gè)類(lèi)在每次程序運行過(guò)程只存在一個(gè)實(shí)例,但它需要首先分配一個(gè)“生的”實(shí)例,然后還必須釋放該實(shí)例。
工廠(chǎng) 方法則可以避免為可能沒(méi)有用的對象盲目分配內存。
23.單件實(shí)例是什么
Foundation 和 Application Kit 框架中的一些類(lèi)只允許創(chuàng )建單件對象,即這些類(lèi)在當前進(jìn)程中的唯一實(shí)例。舉例來(lái)說(shuō),NSFileManager 和NSWorkspace 類(lèi)在使用時(shí)都是基于進(jìn)程進(jìn)行單件對象的實(shí)例化。當向這些類(lèi)請求實(shí)例的時(shí)候,它們會(huì )向您傳遞單一實(shí)例的一個(gè)引用,如果該實(shí)例還不存在,則首先進(jìn)行實(shí)例的分配 和初始化。 單件對象充當控制中心的角色,負責指引或協(xié)調類(lèi)的各種服務(wù)。如果類(lèi)在概念上只有一個(gè)實(shí)例(比如
NSWorkspace),就應該產(chǎn)生 一個(gè)單件實(shí)例,而不是多個(gè)實(shí)例;如果將來(lái)某一天可能有多個(gè)實(shí)例,您可
以使用單件實(shí)例機制,而不是工廠(chǎng)方法或函數。
24.動(dòng)態(tài)綁定
—在運行時(shí)確定要調用的方法
動(dòng)態(tài)綁定將調用方法的確定也推遲到運行時(shí)。在編譯時(shí),方法的調用并不和代碼綁定 在一起,只有在消實(shí)發(fā)送出來(lái)之后,才確定被調用的代碼。通過(guò)動(dòng)態(tài)類(lèi)型和動(dòng)態(tài)綁定技術(shù),您的代碼每次執行都可以得到不同的結果。運行時(shí)因子負責確定消息的接 收者和被調用的方法。 運行時(shí)的消息分發(fā)機制為動(dòng)態(tài)綁定提供支持。當您向一個(gè)動(dòng)態(tài)類(lèi)型確定了的對象發(fā)送消息時(shí),運行環(huán)境系統會(huì )通過(guò)接收者的isa指針定位對象的類(lèi),并以此為起點(diǎn) 確定被調用的方法,方法和消息是動(dòng)態(tài)綁定的。而且,您不必在Objective-C 代碼中做任何工作,就可以自動(dòng)獲取動(dòng)態(tài)綁定的好處。您在每次發(fā)送消息時(shí),
特別是當消息的接收者是動(dòng)態(tài)類(lèi)型已經(jīng)確定的對象時(shí),動(dòng)態(tài)綁定就會(huì )例行而 透明地發(fā)生。
25.obj-c的優(yōu)缺點(diǎn)
objc優(yōu)點(diǎn):
1) Cateogies
2) Posing
3) 動(dòng)態(tài)識別
4) 指標計算
5)彈性訊息傳遞
6) 不是一個(gè)過(guò)度復雜的 C 衍生語(yǔ)言
7) Objective-C 與 C 可混合編程
缺點(diǎn):
1) 不支援命名空間
2) 不支持運算符重載
3) 不支持多重繼承
4) 使用動(dòng)態(tài)運行時(shí)類(lèi)型,所有的方法都是函數調用,所以很多編譯時(shí)優(yōu)化方法都用不到。(如內聯(lián)函數等),性能低劣。
26.sprintf,strcpy,memcpy使用上有什 么要注意的地方
strcpy是一個(gè)字符串拷貝的函數,它的函數原型為strcpy(char *dst, const char *src);
將src開(kāi)始的一段字符串拷貝到dst開(kāi)始的內存中去,結束的標志符號為 '\0',由于拷貝的長(cháng)度不是由我們自己控制的,所以這個(gè)字符串拷貝很容易出錯。具備字符串拷貝功能的函數有memcpy,這是一個(gè)內存拷貝函數,它的函 數原型為memcpy(char *dst, const char* src, unsigned int len);
將長(cháng)度為len的一段內存,從src拷貝到dst中去,這個(gè)函數的長(cháng)度可控。但 是會(huì )有內存疊加的問(wèn)題。
sprintf是格式化函數。將一段數據通過(guò)特定的格式,格式化到一個(gè)字符串緩 沖區中去。sprintf格式化的函數的長(cháng)度不可控,有可能格式化后的字符串會(huì )超出緩沖區的大小,造成溢出。
27. 用變量a給出下面的定義
a) 一個(gè)整型數(An integer)
b)一 個(gè)指向整型數的指針( A pointer to an integer)
c)一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數( A pointer to a pointer to an intege)r
d)一個(gè)有10個(gè)整型數的數組( An array of 10 integers)
e) 一個(gè)有10個(gè)指針的數組,該指針是指向一個(gè)整型數的。(An array of 10 pointers to integers)
f) 一個(gè)指向有10個(gè)整型數數組的指針( A pointer to an array of 10 integers)
g) 一個(gè)指向函數的指針,該函數有一個(gè)整型參數并返回一個(gè)整型數(A pointer to a function that takes an integer as an argument
and returns an integer)
h) 一個(gè)有10個(gè)指針的數組,該指針指向一個(gè)函數,該函數有一個(gè)整型參數并返回一個(gè)整型數( An array of ten pointers to functions t
hat take an integer argument and return an integer )
答 案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
28.readwrite,readonly,assign,retain,copy,nonatomic 屬性的作用
@property是 一個(gè)屬性訪(fǎng)問(wèn)聲明,擴號內支持以下幾個(gè)屬性:
1,getter=getterName,setter=setterName,設置setter與 getter的方法名
2,readwrite,readonly,設置可供訪(fǎng)問(wèn)級別
2,assign,setter方法直接賦值,不進(jìn)行 任何retain操作,為了解決原類(lèi)型與環(huán)循引用問(wèn)題
3,retain,setter方法對參數進(jìn)行release舊值再retain新值,所有 實(shí)現都是這個(gè)順序(CC上有相關(guān)資料)
4,copy,setter方法進(jìn)行Copy操作,與retain處理流程一樣,先舊值release,再 Copy出新的對象,retainCount為1。這是為了減少對上下文的依賴(lài)而引入的機制。
5,nonatomic,非原子性訪(fǎng)問(wèn),不加同步, 多線(xiàn)程并發(fā)訪(fǎng)問(wèn)會(huì )提高性能。注意,如果不加此屬性,則默認是兩個(gè)訪(fǎng)問(wèn)方法都為原子型事務(wù)訪(fǎng)問(wèn)。鎖被加到所屬對象實(shí)例級(我是這么理解的...)。
@synthesize xxx; 來(lái)實(shí)現實(shí)際代碼
*********************************
1Objective-C內部的實(shí)現
2CALayer和View的關(guān)系
3 http協(xié)議,tcp/ip
4 UITableView的那些元素是可以自定義的?
5 c語(yǔ)言的,定義變量,比如int,在什么情況下,其最大值是不同的
6 比較32位平臺和64位平臺不同
7 iphone app為什么會(huì )被打回來(lái),如何避免??
8 為啥離開(kāi)團隊?
CALayer和View的關(guān)系
一個(gè)UIView包含CALayer樹(shù),CALayer是一個(gè)數據模型,包含了一些用于顯示的對象,但本身不用于顯示。
CALayer相當于photoshop的一個(gè)層,很多動(dòng)畫(huà)可以通過(guò)設置CALayer來(lái)實(shí)現。據說(shuō)有人用CALayer顯示圖片來(lái)播放視頻。
Core animation應該是用CAlayer來(lái)實(shí)現各種動(dòng)畫(huà)。
【iphone面試題目】相關(guān)文章:
海信面試英語(yǔ)題目09-19
小升初面試經(jīng)驗猜題目12-14
小升初面試筆試及面試常見(jiàn)題目08-31
英語(yǔ)面試9大面試陷阱題目09-05
中科軟筆試題目和面試題目11-19
小升初英語(yǔ)面試題目11-11
面試會(huì )計的筆試題目12-22
小升初面試常見(jiàn)筆試題目09-09
面試公司網(wǎng)管出的題目07-31
架構面試筆試題目01-25