self.name ="object":會調用對象的setName()方法;
4.請簡述self.name= nil的機制,以及與[namerelease]的區別?
self.name =nil; //使用nil參數調用setName:方法
[name release]生成的訪問器將自動釋放以前的name對象
5.請簡要說明viewDidLoad和viewDidUnload何時調用
viewDidLoad在view從nib文件初始化時調用,
loadView在controller的view爲nil時調用。
此方法在編程實現view時調用,view控制器默認會註冊memory warning notification,
當view controller的任何view沒有用的時候,
select*fromcitys where postcode=436001 and province=’湖%’;
8.打印結果
*(a+1)就是a[1],*(ptr-1)就是a[4],執行結果是2,5
&a+1不是首地址+1,系統會認爲加一個a數組的偏 移,是偏移了一個數組的大小(本例是5個int)
int *ptr=(int *)(&a+1);
則ptr實際 是&(a[5]),也就是a+5
原因如下:
&a是數組指針,其類型爲 int (*)[5];
而 指針加1要根據指針類型加上一定的值,不同類型的指針+1之後增加的大小不同。
a是長度爲5的int數組指針,所以要加 5*sizeof(int)
所以ptr實際是a[5]
但是prt與(&a+1)類型是不一樣的(這點很重要)
所以prt-1只會減去sizeof(int*)
a,&a的地址是一樣的,但意思不一樣
a是數組首地址,也就是a[0]的地址,&a是對象(數組)首地址,
a+1是數組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5].
void Func ( char str[100] ) \u2028
{ \u2028
sizeof(str ) = ? \u2028
} \u2028
void*p = malloc( 100 ); \u2028sizeof( p ) = ?
這題 很常見了,Func ( char str[100] )函數中數組名作爲函數形參時,在函數體內,數組名失去了本身的內涵,僅僅只是一個指針;在失去其內涵的同時,它還失去了其常量特性,可以作自增、自減等 操作,可以被修改。Windows NT 32位平臺下,指針的長度(佔用內存的大小)爲4字節,故sizeof( str ) 、sizeof( p ) 都爲4。
9.用預處理指令#define聲明一個常數,用以表明1年中有多少秒(忽略閏年問題)
答:#defineSECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在這想看到幾件事情:
#define 語法的基本知識(例如:不能以分號結束,括號的使用,等等)
懂得預處理器將爲你計算常數表達式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。
意識到這個表達式將使一個16位機的整型數溢出-因此要用到長整型符號L,告訴編譯器這個常數是的長整型數。
答:#define MIN(A,B) ((A) <= (B) ? (A) : (B))
這個測試是爲下面的目的而設的:
標識#define在宏中應用的基本知識。這是很重要的,因爲直到嵌入(inline)操作符變爲標準C的一部分,宏是方便產生嵌入代碼的唯一方
法,對於嵌入式系統來說,爲了能達到要求的性能,嵌入代碼經常是必須的方法。
三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產生比 if-then-else 更優化的代碼,瞭解這個用法是很重要的。 懂得在宏中小心地把參數用括號括起來 我也用這個問題開始討論宏的副作用,例如: 當你寫下面的代碼時會發生什麼事? least = MIN(*p++, b);
結果是:
((*p++) <= (b) ? (*p++) :(*p++))
這個表達式會產生副作用,指針p會作三次++自增操作。
11.數組和指針的區別
(1)數組可以申請在棧區和數據區;指針可以指向任意類型的內存塊
(2)sizeof作用於數組時,得到的是數組所佔的內存大小;作用於指針時,得到的都是4個字節的大小
(3)數組名錶示數組首地址,值不可以改變,如不可以將 ++ 作用於數組名上;普通指針的值可以改變,如可將++作用於指針上
13.簡述內存分區情況
(1)代碼區:存放函數二進制代碼
(2)數據區:系統運行時申請內存並初始化,系統退出時由系統釋放。存放全局變量、靜態變量、常量
(3)堆區:通過malloc等函數或new等操作符動態申請得到,需程序員手動申請和釋放
(4)棧區:函數模塊內申請,函數結束時由系統自動釋放。存放局部變量、函數參數
14.#include<filename>和#include”filename”有什麼區別
答:#include<filename>直接在庫文件目錄中搜索所包含的文件;#include”filename”在當前目錄下搜索所包含的文件,如果沒有的話再到庫文件目錄搜索。
15.(1)const char *p;(2)charconst*p;(3)char*const p;(4)const char* const p;四個修飾指針有什麼區別
答:(1)定義了一個指向不可變的字符串的字符指針
(2)和(1)一樣
(3)定義了一個指向字符串的指針,該指針值不可改變,即不可改變指向
(4)定義了一個指向不可變的字符串的字符指針,且該指針也不可改變指向
free()是C標準庫裏面的,是一個函數。它調用malloc(),可以立即釋放內存。因此它必須有malloc()傳遞一個指針,不然會引起異常。
-release是NSobject類的一個方法。它不會立即釋放內存,它只是減少對象的一個引用計數。一直到它檢測到0,然後調用-dealloc()。
看到上面的例子,大家就知道了,以後寫Objective-C的代碼變得簡單多了,因爲我們不需要擔心煩人的內存管理,擔心內存泄露了
代碼高速化,由於使用編譯器管理引用計數,減少了低效代碼的可能性
一些舊的代碼,第三方代碼使用的時候比較麻煩;修改代碼需要工數,要麼修改編譯開關
24. 淺複製和深複製的區別?//淺拷貝和深拷貝\u2028
\u2028淺層複製(copy):只複製指向對象的指針,而不復制引用對象本身。//通過對象的指針來訪問這個對象\u2028
\u2028答案:frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)//frame:框架、結構\u2028
bounds指的是:該view在本身座標系統中 的位置和大小。(參照點是本身座標系統)//bounds:界限
4) 使用動態運行時類型,所有的方法都是函數調用,所以很多編譯時優化方法都用不到。(如內聯函數等),性能低劣。
b)一個指向整型數的指針( A pointer to aninteger)
c)一個指向指針的的指針,它指向的指針是指向一個整型數( Apointer to a pointer to an intege)r
d)一個有10個整型數的數組( An array of 10 integers)
e) 一個有10個指針的數組,該指針是指向一個整型數的。(An array of 10 pointers to integers)
f) 一個指向有10個整型數數組的指針( A pointer to an array of 10 integers)
g) 一個指向函數的指針,該函數有一個整型參數並返回一個整型數(Apointer to a function that takes an integer as an argument
h)一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數( An array of ten pointers to functions t
hat takean integer argument and return an integer )
b) int *a; // A pointer to aninteger
c) int **a; // A pointer to apointer to an integer
d) int a[10]; // An array of10 integers
e) int *a[10]; // An array of10 pointers to integers
f) int (*a)[10]; // A pointerto an array of 10 integers
g) int (*a)(int); // A pointerto a function a that takes an integer argument and returns aninteger
答:隊列和棧是兩種不同的數據容器。從"數據結構"的角度看,它們都是線性結構,即數據元素之間的關係相同。
隊列是一種先進先出的數據結構,它在兩端進行操作,一端進行入隊列操作,一端進行出列隊操作。
GET 方法提交數據不安全,數據置於請求行,客戶端地址欄可見;
POST 方法提交數據安全,數據置於消息主體內,客戶端不可見
32. 控件主要響應3種事件:(基於觸摸的事件)、(基於值的事件)和(基於編輯的事件)。
33. xib文件的構成分爲哪3個圖標?都具有什麼功能。(10分)
答:File’s Owner 是所有nib文件中的每個圖標,它表示從磁盤加載nib文件的對象;
First Responder就是用戶當前正在與之交互的對象;
View顯示用戶界面;完成用戶交互;是UIView類或其子類。
答:loadView儘管不直接調用該方法,如多手動創建自己的視圖,那麼應該覆蓋這個方法並將它們賦值給試圖控制器的view屬性。
viewDidLoad只有在視圖控制器將其視圖載入到內存之後才調用該方法,這是執行任何其他初始化操作的入口。
viewDidUnload當試圖控制器從內存釋放自己的方法的時候調用,用於清楚那些可能已經在試圖控制器中創建的對象。
viewDidAppear當視圖添加到窗口中以後或者上層視圖移出圖層後本視圖變成頂級視圖時調用,用於放置那些需要在視圖顯示後執行的代碼。確保調用[super viewDidAppear:]。
35. 動畫有基本類型有哪幾種;表視圖有哪幾種基本樣式(10分)?
36. 實現簡單的表格顯示需要設置UITableView的什麼屬性、實現什麼協議(10分)?
答:實現簡單的表格顯示需要設置UITableView的dataSource和delegate屬性,實現UITableViewDataSource和UITableViewDelegate協議。
37. Cocoa Touch提供了哪幾種Core Animation過渡類型(10分)?
答:Cocoa Touch提供了4種Core Animation過渡類型,分別爲:交叉淡化、推擠、顯示和覆蓋。
2. UIView有個重要屬性layer,可以返回它的主CALayer實例。
3. UIView的CALayer類似UIView的子View樹形結構,也可以向它的layer上添加子layer,來完成某些特殊的表示。即CALayer層是可以嵌套的。
5. 動畫的運作:對UIView的subLayer(非主Layer)屬性進行更改,系統將自動進行動畫生成,動畫持續時間的缺省值似乎是0.5秒。
7.渲染:當更新層,改變不能立即顯示在屏幕上。當所有的層都準備好時,可以調用setNeedsDisplay方法來重繪顯示。
8.變換:要在一個層中添加一個3D或仿射變換,可以分別設置層的transform或affineTransform屬性。
鏈表逆序就是把一個鏈表按照原來的鏈接順序逆序實現(也就是將頭變成尾,尾變成頭)。
編程思路:其實最關鍵的是先通過原來的鏈接順序找到下個節點,然後再把前個節點反序。
41. Quatrz 2D的繪圖功能的三個核心概念是什麼並簡述其作用(10分)。
42. iPhone OS主要提供了幾種播放音頻的方法(10分)?
43. 使用AVAudioPlayer類調用哪個框架、使用步驟(10分)?
-(void)touchesBegan:(NSSet*)touchedwithEvent:(UIEvent*)event;
-(void)touchesMoved:(NSSet*)touched withEvent:(UIEvent*)event;
-(void)touchesEnded:(NSSet*)touchedwithEvent:(UIEvent*)event;
-(void)touchesCanceled:(NSSet*)touchedwithEvent:(UIEvent*)event;
45. 實例化一個UITableView對象,要求寫出關鍵語句(10分)。
答:創建Socket的上下文;創建Socket;配置要訪問的服務器信息;封裝服務器信息;連接服務器;
47. Core Foundation中提供了哪幾種操作Socket的方法(10分)?
答:CFNetwork、CFSocket和BSD Socket。
答:以DOM方式解析XML文件;以SAX方式解析XML文件;
-(void)doSomething:(NSString*)str;
@interfaceSimpleClass:NSObject< SimpleProtocol >{
-(void)doSomething:(NSString *)str
答案:多態,子類指針可以賦值給父類。這個題目其實可以出到一切面向對象語言中,因此關於多態,繼承和封裝基本最好都有個自我意識的理解,也並非一定要把書上資料上寫的能背出來。最重要的是轉化成自我理解。
答案:基本能用熟悉的語言寫出一個單例,以及可以運用到的場景或是你編程中碰到過運用的此種模式的框架類等。進一步點,考慮下如何在多線程訪問單例時的安全性。
54. 是否在一個視圖控制器中嵌入兩個tableview控制器?\u2028
55.\u2028一個tableView是否可以關聯兩個不同的數據源?你會怎麼處理?
答案:id是個很重要的類型,是個可以指向任何類型的指針或者可以理解爲指向任何未知類型的指針。
58.自動釋放池跟GC(垃圾回收)有什麼區別?iPhone上有GC麼?[poolrelease] 和[pooldrain]有什麼區別?
60. ios平臺怎麼做數據的持久化?coredata和sqlite有無必然聯繫?coredata是一個關係型數據庫嗎?
63.假定輸入的字符串中只包含字母和*號。編寫函數fun,功能是,除了中間和尾部的*號外,
例:*****A*BC*DEF*G**** 結果爲:A*BC*DEF*G****
64.截取字符串”20|http://www.621life.com“ 中 ‘|’字符前面及後面的數據,分別輸出它們(10分)。
NSString *str = "20|http://www.621life.com";
NSRange range = [strrangeOfString:@"|"];
int location = range.location;
NSString *str1 = [strsubstringToIndex:location];
NSString *str2 = [str substringFromIndex:location+1];
65.獲取項目根路徑,並在其下創建一個名稱爲userData的目錄。(10分)。
// 獲取根路徑
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:];
// 創建文件系統管理器
NSFileManager *fileManager = [[NSFileManageralloc] init];
// 判斷userData目錄是否存在
if(![fileManagerfileExistsAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]]) {
// 不存在,創建一個userData目錄
[fileManagercreateDirectoryAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]withIntermediateDirectories:falseattributes:nilerror:nil];
}
66.tableView的重用機制(10分)?
UITableView通過重用單元格來達到節省內存的目的:通過爲每個單元格指定一個重用標識符(reuseIdentifier),即指定了單元格的種類,以及當單元格滾出屏幕時,允許恢復單元格以便重用.對於不同種類的單元格使用不同的ID,對於簡單的表格,一個標識符就夠了.
67.這段代碼有什麼問題嗎
@implementation Person
i. (void)setAge:(int)newAge
{ self.age = newAge; }
死循環
68.用變量a給出下面的定義
a) 一個整型
b) 一個指向整型數的指針
c) 一個指向指針的的指針,它指向的指針是指向一個整型數
d) 一個有10個整型數的數組
e) 一個有10個指針的數組,該指針是指向一個整型數的
f) 一個指向有10個整型數數組的指針
g) 一個指向函數的指針,該函數有一個整型參數並返回一個整型數
h) 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數
a) int a;
b) int *a;
c) int **a;
d) int a[10]
e) int *a[10];
f) int (*a)[10];
g) int (*a)(int);
i) int (*a[10])(int);
69.給定一個字符串,輸出本字符串中只出現一次並且最靠前的那個字符的位置?
比如"abaccddeeef" 則是b,輸出2
int find(char *_str)
{
char *p = _str;
inti = 1;
while (*p)
{
char *temp = _str;
while (*temp)
{
if ((*p ==*temp)&&(p != temp))
{
break;
}
temp++;
if (*temp == 0) {
returni;
}
}
i++;
p++;
}
return-1;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
intfind_char(constchar* str)
{
staticintpos[256];
const unsigned char* p =(const unsigned char*)str;
inti = 0;
if( (!str) || (!(*str)) )return -1;
memset(pos,-1,sizeof(pos));
while(*p){
if(pos[*p] == -1){
pos[*p] = p-(const unsigned char*)str;
}else{
pos[*p] = -2;
}
p++;
}
for(i=0;i<sizeof(pos)/sizeof(pos[0]);i++){
if(pos[i]>=0)returnpos[i];
}
return -1;
}
int main()
{
constchar* p ="abaccddeeef";
intpos = find_char(p);
printf("%d, it is'%c'\n",pos,pos!=-1?p[pos]:' ');
p ="abcdefghijklmnopqrstuvwxyz "
"abcdefghijklmnopqrstuwxyz";
pos = find_char(p);
printf("%d, it is'%c'\n",pos,pos!=-1?p[pos]:' ');
return0;
}
70.objective-c中的數字對象都有哪些,簡述它們與基本數據類型的區別是什麼?
在OC中NSNumber是數字對象,可以進行拆裝箱操作!
//將int轉爲NSNumber
NSNumber *num = [NSNumber numberWithInt:123];
//得到一個int
inttestNum = [numintValue];
71.用NSLog函數輸出一個浮點類型,結果四捨五入,並保留一位小數
NSLog(@”%0.1f”,4.4324);
72.objective-c中的詞典對象、可變詞典對象是哪個,初始化一個含有兩個鍵值對的可變詞典對象,並動態的添加和刪除一條記錄,輸出第一條記錄.
詞典NSDictionary,可變詞典NSMutableDictionary,
//初始化一個可變詞典,帶有2個鍵值對
NSMutableDictionary *dic =[NSMutableDictionarydictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",nil];
//添加
[dicsetObject:@"value3"forKey:@"key3"];
//刪除
[dicremoveObjectForKey:@"key3"];
//獲取(按key獲取)
[dicobjectForKey:@"key1"];
73.獲取項目根路徑,並在其下創建一個名稱爲userData的目錄。
// 獲取根路徑
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documentsDirectory = [paths objectAtIndex:];
// 創建文件系統管理器
NSFileManager *fileManager= [[NSFileManageralloc] init];
// 判斷userData目錄是否存在
if(![fileManagerfileExistsAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]]) {
// 不存在,創建一個userData目錄
[fileManagercreateDirectoryAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]withIntermediateDirectories:falseattributes:nilerror:nil];
}
74.do-while與 while-do的區別?
do-while 先執行循環體,然後判斷條件,如果條件判斷爲ture,則繼續執行循環體,如果判斷爲false,則不執行循環體
while-do 是先判斷條件是否正確,若正確則執行循環體,若不正確則不執行循環體。
所以do-while至少循環一次,而while-do有可能一次也不循環。
75.用C語言,求2到100內的所有素數和。
#include<stdio.h>
intisPrime(int n) //求素數,這是最經典的算法代碼。建議記住
{
inti;
for(i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
int main()
{
inti,sum=0;
for(i=2;i<100;i++)
if( isPrime(i))
sum+=i;
printf("%5d",sum);
return 0 ;
}
intisPrime(int n)
{
inti;
for(i=2;i<=n/2;i++)
{
if(n%i==0)
break;
}
if(i>n/2)
return1;
else
return0;
}
76.單件實例是什麼(10分)。
Foundation
和 Application Kit框架中的一些類只允許創建單件對象,即這些類在當前進程中的唯一實例。舉例來說,NSFileManager和NSWorkspace
類在使用時都是基於進程進行單件對象的實例化。當向這些類請求實例的時候,它們會向您傳遞單一實例的一個引用,如果該實例還不存在,則首先進行實例的分配
和初始化。 單件對象充當控制中心的角色,負責指引或協調類的各種服務。如果類在概念上只有一個實例(比如
NSWorkspace),就應該產生 一個單件實例,而不是多個實例;如果將來某一天可能有多個實例,您可以使用單件實例機制,而不是工廠方法或函數。
77.自動釋放池是什麼,如何工作。
當您向一個對象發送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,因此自動釋放池定義的作用域內的其它對象可以向它發送消息。當程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放