長沙戴維營教育iOS開發面試題週刊
[TOC]
1. 介紹一下assign, copy與retain的區別。
assign 簡單的指標賦值,不涉及引用計數的操作。
copy 產生一個新物件,引用計數為1,老物件引用計數不變。
retain 物件的引用計數加1。
weak 自動引用計數環境下使用,與assign類似,但是當物件釋放後會自動置為nil。
strong 自動引用計數環境下使用,類似於retain,強引用的物件不會被釋放。
2. center、frame與bounds的關係是什麼?
center和frame是指檢視在父檢視的座標系統中的表示,center表示UIView的中心點在父檢視座標系統中的位置,frame表示UIView在父檢視座標系統中的位置和大小。bounds表示檢視在它本身的座標系統中的位置。如果修改bounds的origin會導致該檢視的子檢視位置發生改變,但不會影響檢視本身的位置。一般來說,frame是由center和bounds計算得來。或者是說UIView的frame由它所擁有的CALayer的position、anchorPoint和bounds決定。
3. 執行下面的程式碼會發生什麼現象?
Ball*ball=[[[[Ballalloc]init]autorelease]autorelease];
給物件傳送一次autorelease
訊息就會將它在自動釋放池中註冊一次。當自動釋放池release
或者drain
的時候,將給註冊到裡面的物件按註冊的次數傳送release
訊息。因此最後ball
物件會接收到兩次release
訊息,由於ball
的引用計數為1,當接收第一次release
後就被釋放了。第二次release
的時候會導致程式崩潰。
4. 什麼是KVC,如何使用?
KVC是由NSKeyValueCoding非正式協議所實現的一種機制,使得應用程式可以通過名字或Key來訪問物件的屬性,而不是直接呼叫訪問器或者例項變數。 示例程式碼:
// Copyright (c) 2014年 戴維營教育. All rights reserved.
//
#import
@classDVIDog;
@interfaceDVIStudent:NSObject
{
@public
NSString*_name;
@protected
NSString*_studentID;
@private
float_height;
}
//_age
@property(nonatomic,assign)intage;
@property(nonatomic,strong)DVIDog*dog;
@property(nonatomic,strong)NSMutableArray*dogsArray;
-(void)printInfo;
-(void)setValueFromDict:(NSDictionary*)dict;
@end
類的實現:
//
// DVIStudent.m
// KVCSample
//
// Copyright (c) 2014年 戴維營教育. All rights reserved.
//
#import "DVIStudent.h"
#import "DVIDog.h"
@implementationDVIStudent
-(id)init
{
if(self=[superinit]){
_dogsArray=[NSMutableArrayarray];
}
returnself;
}
@synthesizeage=_age;
-(void)printInfo
{
NSLog(@"%@:%@:%d:%f",_name,_studentID,_age,_height);
}
-(void)setValueFromDict:(NSDictionary*)dict
{
_name=[dictobjectForKey:@"name"];
_age=[[dictobjectForKey:@"age"]intValue];
_height=[[dictobjectForKey:@"height"]floatValue];
_studentID=[dictobjectForKey:@"studentID"];
}
-(void)setValue:(id)valueforUndefinedKey:(NSString*)key
{
NSLog(@"%@:%@",key,value);
}
-(void)setNilValueForKey:(NSString*)key
{
NSLog(@"%@",key);
}
-(void)setAge:(int)age
{
NSLog(@"age: %d",age);
_age=age;
_height+=0.1;
}
-(int)age
{
return_age;
}
@end
第二個類:
// Copyright (c) 2014年 戴維營教育. All rights reserved.
//
#import
@interfaceDVIDog:NSObject
@property(nonatomic,assign)intweight;
@end
第二個類的實現:
// Copyright (c) 2014年 戴維營教育. All rights reserved.
//
#import "DVIDog.h"
@implementationDVIDog
@end
使用KVC訪問屬性:
_student=[[DVIStudentalloc]init];
// student.age = 20;
[_studentsetValue:@20forKey:@"age"];
_student->_name=@"Zhangsan";
//1. _key
//2. key
[_studentsetValue:@"1001"forKey:@"studentID"];
[_studentsetValue:@1.7forKey:@"height"];
[_studentprintInfo];
NSLog(@"%@",[_studentvalueForKey:@"age"]);
NSDictionary*dict=@{@"name":@"Lisi",@"studentID":@"2002",@"age":@33,@"height":@1.8};
[_studentsetValueFromDict:dict];
[_studentprintInfo];
dict=@{@"name":@"Wangwu",@"studentID":@"3002",@"age":@23,@"height":@0.8};
[_studentsetValuesForKeysWithDictionary:dict];
[_studentprintInfo];
DVIDog*dog=[[DVIDogalloc]init];
_student.dog=dog;
_student.dog.weight=20;
[_studentsetValue:@30forKeyPath:@"dog.weight"];
NSLog(@"%@",[_studentvalueForKeyPath:@"dog.weight"]);
[_studentsetValue:@12forKey:@"weight"];
[_studentsetNilValueForKey:@"age"];
NSLog(@"%@",[_studentvalueForKey:@"age"]);
KVC中除了訪問單個屬性外,還能夠對集合屬性進行訪問和操作:
for(inti=0;i<</span>100;++i){
DVIDog*dog=[[DVIDogalloc]init];
dog.weight=i;
[_student.dogsArrayaddObject:dog];
}
//
NSLog(@"%@",[_studentvalueForKeyPath:@"[email protected]"]);
常用的集合操作:
bash @avg, @max, @min, @count, @sum等
在KVC的基礎上,蘋果提供了KVO來獲取屬性改變的事件: 新增KVO觀察者:
[_studentaddObserver:selfforKeyPath:@"name"options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld|NSKeyValueObservingOptionPriorcontext:nil];
觀察者獲取通知:
-(void)observeValueForKeyPath:(NSString*)keyPathofObject:(id)objectchange:(NSDictionary*)changecontext:(void*)context
{
NSLog(@"%@: %@: %@",keyPath,object,change);
_nameLabel.text=[changeobjectForKey:NSKeyValueChangeNewKey];
}
5.舉例說明幾個常用的Xcode環境變數。
$(BUILT_PRODUCTS_DIR) 構建成功後,目標檔案存放的位置。
$(TARGET_NAME) 目標工程名。
$(SRCROOT) 工程檔案存放的位置。
$(CURRENT_PROJECT_VERSION) 當前工程版本號。
6. 需要對一個代理物件進行強引用(retain)嗎?
不應該對一個物件進行強引用。代理物件可能對被代理物件擁有強引用,如UITableViewController對它裡面的tableView的引用。如果tableView的代理也是強引用的話,就會導致因為迴圈引用而出現記憶體洩漏。
7. 描述一下UIButton類的繼承關係,直到NSObject。
NSObject <- UIResponder <- UIView <- UIControl <- UIButton
8. 什麼是@dynamic?
@synthesize 編譯器自動生成setter和getter。 @dynamic 需要手工實現setter和getter,並且不能在後面用=
號標明對應的例項變數。 @compatibility_alias 給類起別名。
@compatibility_aliasDVINewStudentDVIStudent;
@encode 獲取型別的字串,可以用來判斷型別。
@encode(int)//i
@encode(CGRect)//{CGRect={CGPoint=ff}{CGSize=ff}}
@encode(DVIStudent)//{DVIStudent=#}
9. 給一個物件傳送performSelector:withObject:afterDelay:訊息後,會給對物件進行retain嗎?
給物件傳送延時執行的訊息會對物件進行retain
操作,並且在方法執行完後進行release
操作。
10. NSCoder類的用途是什麼?
NSCoder是一個抽象的基類,為子類定義了在物件和其它Objective-C資料在記憶體和其它格式直接進行轉換的能力,是歸檔(將物件和資料存放到磁碟)和分發(在程序和執行緒直接進行資料傳遞)的基礎。在基礎框架(Foundation)中提供了NSKeyedArchiver、NSKeyedUnArchiver等子類。NSCoder可以操作物件、標量、C語言陣列、結構體、字串等,但是不支援聯合體、void指標、函式指標等與平臺實現相關的資料型別。
轉載於:https://blog.51cto.com/diveinedu/1617819