zoukankan      html  css  js  c++  java
  • ios 属性易错点

    1.self.name = [[NSString alloc] init];

    2._name = [[NSString alloc] init];

     self.name = @"whatif";

    上面的两种方式:我们多数人认为1和2中_name的应用计数都是2,因为对于1:用了"self.name="(set方法),alloc了,引用计数为2;对于2:用了alloc,又用了"self.name="(set方法),引用计数为2.

    其实上面的说法是错误的!!!

    正确的答案是:1中_name的引用计数为2,2中_name的引用计数为1。

    原因是set方法的内部实现:

    - (void)setName:(NSString *)name{

      if(_name != name){

          [_name release];

          [_name = name retain];

    }}

    对于第1种情况:先用了"self.name=",由于_name没有初始化,为nil,调用set方法的时候,[_name release],不起作用,没有减1,但是[name retain]了,_name引用计数加了1次;然后又用了alloc,_name的引用计数变为2。

    对于第2种情况:先用了alloc,_name引用计数变为1;由于_name 不为nil,调用set方法的时候,[_name release],引用计数减1,此时,_name的引用计数为0;[name retain]了一次的时候,引用计数为1。

    致力于ios开发
  • 相关阅读:
    HTML5 WEB SQL
    Android-day04
    Android-day03
    Android-day02
    Android-day01
    java.lang.ClassNotFoundException: org.apache.jsp.index_jsp
    事务管理、整合Junit、整合Web、SSH整合
    AOP、AspectJ、JdbcTemplate
    Spring基础
    Hibernate对连接池的支持
  • 原文地址:https://www.cnblogs.com/hanjun/p/2960877.html
Copyright © 2011-2022 走看看