本文转自 http://www.999dh.net/article/iphone_ios_art/27.html 如需转载请注明,谢谢!
OC学了不是 很久,虽然有C++的基础,但是对于OC特有的知识点还是比较模糊的。
在根据书上的例子操作的时候,经常会使用到如下的语句:
@property(retain,nonatomic)XXXXX;
@synthesize XXXX;
知道这两句话的意思是简化了 setter以及getter函数。
但是具体为什么会用到setter以及getter函数一直都没有去研究。
今天在使用引用计数的时候,发现了一个问题,描述如下
@interface CRViewController : UIViewController
{
NSArray * arr;
}
@property(retain,nonatomic) NSArray * arr;
-(IBAction)buttonPressed:(id)sender;
@end
/////.m文件
@synthesize arr;
-(IBAction)buttonPressed:(id)sender
{
int index = 0;
for(index = 0; index < [arr count]; ++ index)
{
NSLog(@"--%@---",[arr objectAtIndex:index]);
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSArray * array = [[NSArray alloc] initWithObjects:@"aaaaa",@"2222",@"eeeee", nil];
self.arr = array;
[array release];
}
在viewDidLoad里面,使用了一个临时变量 array,然后将array赋值给arr,最后对array进行了release。
对于引用计数有些许的了解,但是发现这里的不对,因为对array release之后,array对应的内存块应该是无效了的,那为什么arr还是继续可以使用呢?
问了老年, 看了下文档,原来是在使用 self.arr=array这句话的时候,用到了 arr的setter函数,因为在setter函数里面进行了 retain操作,所以这样的话 array对应的内存块其实还是有效的。
如果将self.arr=array修改成 arr=array,那就不会调用 setter函数了。
具体关于 setter以及getter函数的使用情况在这篇日志里面有介绍 我想各位一看就可以明白的
http://blog.csdn.net/lonelyroamer/article/details/7665112