对@property reatin以及retainCount(引用计数)的理解

本文转自 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

原文地址:https://www.cnblogs.com/rollrock/p/2787700.html