解决方案 »

  1.   

    可以确定是你的get,set方法有问题
      

  2.   

    getter的方法不是这样定义的嘛?- (NSString *) name
    {
        return [[_name retain] autorelease];
    }
      

  3.   

    把你自定义的spouse getter、setter 贴出来呗,问题主要出在这两个方法了
    如果你的实现和name的getter类似的话,结果就没有什么好惊讶的。要提醒的一点是,autorelease不会导致retainCount立即发生变化,而是由autoreleasepool中进行调整的
      

  4.   

    这使我写的setter 和getter方法 有问题吗
    setter方法 - (void) setSpouse:(Person *)spouse
    {
        if(_spouse != spouse)
        {
        [_spouse release];
        _spouse = [spouse retain];
        }
    }
    getter方法- (Person *) spouse
    {
        return [[_spouse retain] autorelease];
    }
      

  5.   

    需要明确的一点是,由编译器自动合成的属性,其行为是会随着编译器的版本不同而改变的。《Effective Objective-C》中专门有一条建议,指出尽量不要依赖retainCount来做判断,因为类似属性这种返回对象的方法中,可能会有较复杂的对象内存管理逻辑,作为方法的设计者,只需要符合标准规范即可,即使在内部retain多次,然后autorelease多次,也是可能的,其行为很难确定。但有一点是可以确定的,就是retain和release或autorelease一定是平衡的。再来分析你的代码:
    对于@synthesis的属性来说,显然没有像你的代码一样,getSpouse时进行retain操作。
    第一个输出:由于man和woman互相retain,所以woman的retainCount是2。
    第二个输出:虽然访问了man.spouse,但由于spouse属性内部没有进行retain,所以woman的retainCount不变,仍然是2
    第三个输出:由于调用了[man divorce],释放了man, woman相互的引用,所以各自的retainCount立即减1,结果是1对于你写的手动内存管理代码来说:
    第一个输出:和上面的一样,木有区别,所以是2
    第二个输出:由于你的spouse属性getter方法对_spouse进行了retain,所以在输出时的man.spouse.name导致其retainCount为3
    第三个输出:[man divorce]里,又调用了两次self.spouse,所以本来释放后应该是1的,但却因为两次retain,导致变成了3
      

  6.   

    那我可以理解为属性中实现的getter方法中没有 retain 和 autorelease 只是返回的是属性的值而已吗?