zoukankan      html  css  js  c++  java
  • 对@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

  • 相关阅读:
    元素定位方法与等待
    xpath定位的总结
    模拟登录
    shell的数组
    shell的函数
    shell的循环
    shell的流程控制语句case
    shell的while循环
    shell的if条件判断
    shell的for循环
  • 原文地址:https://www.cnblogs.com/rollrock/p/2787700.html
Copyright © 2011-2022 走看看