iOS經(jīng)典筆試題整理--⑵014年8月
1.回答person的retainCount值,并解釋為何
Person * per = [[Person alloc] init]; 此時person 的retainCount的值是1self.person
= per;
在self.person 時,如果是assign,person的 retainCount的值不變,仍為1若是:retain person的retainCount的值加1,變成2
若是:copy person的retainCount值不變,仍為1
2、這段代碼有甚么問題嗎:@implementation Person
- (void)setAge:(int)newAge {
self.age = newAge;}
@end
會死循環(huán),會重復調用自己!self.age 改成_age便可;
并且書寫不規(guī)范:setter方法中的newAge應當為age
3、這段代碼有甚么問題,如何修改
for (int i = 0; i < someLargeNumber; i++) {NSString *string = @”Abc”;
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];NSLog(@“%@”, string);
}
會出現(xiàn)內存泄漏
修改以后:
for(int i = 0; i<1000;i++){
NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init];NSString *string = @"Abc";
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];NSLog(@"%@",string);
//釋放池
[pool1 drain];}
延伸:堆棧的區(qū)分:
(1)管理方式:對棧來說,是由編譯器自動管理,無需我們手工控制;對堆來講,釋放工作由程序員控制,容易產生memory leak。(2)申請大小:能從棧取得的空間較小,堆是向高地址擴大的數(shù)據(jù)結構,是不連續(xù)的內存區(qū)域。堆的大小受限于計算機系統(tǒng)中有效的虛擬內存。因而可知,堆取得的空間比較靈活,也比較大。(3)碎片問題:對堆來說,頻繁的new/delete必將會造成內存空間的不連續(xù),從而造成大量的碎片,使程序效力下降。對棧來說,則不會存在這個問題,由于棧是先進后出的隊列,他們是如此的逐一對應,以致于永久都不可能有1個內存塊從棧中間彈出(4)分配方式:堆都是動態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動態(tài)分配由 alloca函數(shù)進行分配,但是棧的動態(tài)分配和堆是不同的,他的動態(tài)分配是由編譯器進行釋放,無需我們手工實現(xiàn)。(5)分配效力:棧是機器系統(tǒng)提供的數(shù)據(jù)結構,計算機會在底層對棧提供支持:分配專門的寄存器寄存棧的地址,壓棧出棧都有專門的指令履行,這就決定了棧的效力比較高。堆則是C/C++函數(shù)庫提供的,它的機制是很復雜的。4、寫1個便利構造器
+(id)Person{
Person *person=[Person alloc]init];
return [person autorelease]; 備注:ARC時不用 autorelease
}
5、截取字符串”20 | http://www.baidu.com”中,”|”字符前面和后面的數(shù)據(jù),分別輸出它們。