说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:《招聘一个靠谱的 iOS》下面是我对这个面试题的解答
本人iOS github:https://github.com/netyouli?tab=repositories 欢迎mark star。
1.[※]@property中有哪些属性关键字?
(nonatomic, atomic , strong , retain , copy , week , assign , setter , getter , readwrite ,readonly)
2.[※]strong 和retain有什么区别 week 和 assign有什么区别?
(strong 和 retina 基本一样在进行setter方法时会release 旧 retina新 strong 是ARC模式下默认属性关键字,week在对象被释放的时候会自动把对象设置为nil而不会成为野指针,assign不会设置成nil导致对象变成野指针)
3.[※]weak属性需要在dealloc中置nil么?
(不需要,看上题答案解析)
4.[※※]@synthesize和@dynamic分别有什么作用?
(@synthesize 在编译的时候会自动加入getter 和 setter方法以及默认私有成员对象在xcode5.0以后@synthesize可以不写,
实例:
@property (strong) NSString * whc;
@synthesize whc;
在编译的时候xcode会自动帮我们生成如下方法:
默认私有对象为:NSString * _whc;
-(void)setWhc:(NSString *)whc{
[_whc release];
_whc = [whc retain];
}
-(NSString *)whc{
return _whc;
}
@dynamic 在编译时不会自动生成getter 和 setter 方法,而是在运行时动态在 + (BOOL)resolveInstanceMethod:(SEL)aSEL
方法里指定getter 和 setter方法名称并且动态添加。
例如:
定义private 对象NSString * _whc;
@dynamic wHC;
void setWHC(id self, SEL _cmd , NSString whc) {
// implementation ….
_whc = whc.copy;
}
NSString * wHC(id self , SEL _cmd){
return _whc;
}
+ (BOOL)resolveInstanceMethod:(SEL)aSEL
{
if (aSEL == @selector(setWHC:)) {
class_addMethod([self class], aSEL, (IMP) setWHC, "v@:@");//v表示返回类型void 后面三个以此表示(@表示self,:表示_cmd,@表示whc)
return YES;
}else if(aSEL == @selector(wHC)){
class_addMethod([self class], aSEL, (IMP) wHC,"@@:");// 后面三个以此表示(@表示返回类型NSString,@表示self,:表示_cmd
return YES;
}
)
return [super resolveInstanceMethod:aSEL];
}
@end
)
5.[※※※]ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些?
(对象类对象属性默认关键字有:nonatomic , strong , readwrite , setter , getter 对于内建类型属性是默认关键字有:nonatomic , assgin , readwrite, setter ,