笔试题2
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔试题2相关的知识,希望对你有一定的参考价值。
1.@property @synthesize的含义以及误区。
答:@property的作用是定义属性,声明getter,setter方法。(注意:属性不是变量)
@synthesize的作用是实现属性的,如getter,setter方法.
在声明属性的情况下如果重写setter,getter,方法,就需要把未识别的变量在@synthesize中定义,把属性的存取方法作用于变量。如:
.h文件中
@property (nonatomic,assign)NSInteger age;
@property (nonatomic,retain)NSString * name;
@property (nonatomic,copy)NSString * bb;
.m文件中
//如果不加以下三行,就报会找不到_age,_name,_bb变量的错误
@synthesize age = _age;
@synthesize name = _name;
@synthesize bb =_bb;
- (void)setName:(NSString *)name
{ if (_name!=name) {
[_name release];
_name = [name retain]; }
}
- (NSString *)name{
return [[_name retain] autorelease]
;}
- (void)setAge:(NSInteger)age{
_age = age;}
- (NSInteger)age{ return _age;}
- (void)setBb:(NSString *)bb{
if (_bb!=bb) { [_bb release]; _bb = [bb copy]; }
}
- (NSString *)bb{
return [[_bb retain]autorelease];
}
总结:一定要分清属性和变量的区别,不能混淆。@synthesize 声明的属性=变量。意思是,将属性的setter,getter方法,作用于这个变量。
2.一个对象的dealloc方法在什么时候调用?
你自己不应该 dealloc 任何对象,objective-c 里面通过reference counting来管理memory,当一个对象的 reference counting=0时,系统自动会调用dealloc释放此对象,所以在没有auto reference counting 下,你用release, retain就好了,不用dealloc。
auto reference counting(ARC)
然而现在随着ARC的推广,当你不再用一个对象时,编译器(compiler)会自动检查你的代码,看你是否还需要此对象与否,所以现在连retain,release都不用了,有点类似java里面的garbage collection, 但跟java garbage collection又有不同,因为ARC 不管reference cycles,你需要用week,strong来调整reference cycles,不过这里就不多讲了
3.
分类category能够向一个已有的类中添加方法。
一个类中可以添加多个分类,分类可以单独创立一个文件,也可以写在原有类中。
拓展extensions(匿名的分类)是向当前类中添加私有变量,私有方法。方法放在主实现区实现。外类不能调用,自身类可以调用。 如下,。m文件下声明,并实现。
4,
@protocol 协议名-(void) go;----1
@optional
-(void) stop; -----2
@required
-(void) start; -----3
@end
1这种什么都不写的就是必须实现的方法,2这种是可选择实现的,也就是说你实现也可以,不实现也可以,3这种是必须实现的方法,跟第一种一样;因为@protocol默认的是必须实现的,所以[email protected]可以不写,可以把3放在和1在一起表示这2个方法必须实现
5.
以上是关于笔试题2的主要内容,如果未能解决你的问题,请参考以下文章