天天看點

Objective-C:對象之間循環引用會造成死循環

對象之間的循環引用        兩個對象A、B,有可能會出現一種特殊的情況:A中包含B的執行個體變量;B中又包含A的執行個體變量,如果兩個執行個體變量都是強引用(A有B執行個體變量的所有權,B也有A的執行個體變量的所有權),然後再兩個對象銷毀時,會出現A、B都不能正常銷毀的情況。      類A:

//  A.h
//  02-循環引用
//
//  Created by ma c on 15/8/14.
//  Copyright (c) 2015年. All rights reserved.
//

#import <Foundation/Foundation.h>
//類的前向聲明(隻存在包含關系中)
@class B;
@interface A : NSObject
@property(nonatomic,retain)B *b;//A獲得b對象的所有權
@end
-------------------------------------------------------

//  A.m
//  02-循環引用
//
//  Created by ma c on 15/8/14.
//  Copyright (c) 2015年. All rights reserved.
//

#import "A.h"
#import "B.h"
@implementation A
-(void)dealloc
{
    [_b release];
    NSLog(@"A dealloc");
    [super dealloc];
}
@end      

    類B:

//  B.h
//  02-循環引用
//
//  Created by ma c on 15/8/14.
//  Copyright (c) 2015年. All rights reserved.
//

#import <Foundation/Foundation.h>
@class A;
@interface B : NSObject
@property(nonatomic,retain)A *a;//B獲得a對象所有權
@end

------------------------------------------------------------

//  B.m
//  02-循環引用
//
//  Created by ma c on 15/8/14.
//  Copyright (c) 2015年. All rights reserved.
//

#import "B.h"
#import "A.h"
@implementation B
-(void)dealloc
{
    //[_a release];
    NSLog(@"B dealloc");
    [super dealloc];
}
@end      

      主函數測試:

1 //  main.m
 2 //  02-循環引用
 3 //
 4 //  Created by ma c on 15/8/14.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import <Foundation/Foundation.h>
 9 #import "A.h"
10 #import "B.h"
11 int main(int argc, const char * argv[])
12 {
13     @autoreleasepool
14     {
15     //測試對象間的循環引用
16     A *a = [[A alloc]init];
17     B *b = [[B alloc]init];
18     
19     [a setB:b];
20     [b setA:a];
21     
22     [a release];
23     [b release];
24     
25     }
26     return 0;
27 }      

     測試結果是:

Program ended with exit code: 0      

    上面的結果明顯的a和b對象都沒有成功釋放記憶體而銷毀,因為它們都是retain獲得對方的所有權,誰都不肯先釋放;

處理方法:将雙方任意一方的對象屬性retain做一下修改即可,改為assign

修改後測試結果如下:

2015-08-14 16:32:27.210 02-循環引用[1427:94559] A dealloc
2015-08-14 16:32:27.211 02-循環引用[1427:94559] B dealloc
Program ended with exit code: 0      

轉載于:https://www.cnblogs.com/XYQ-208910/p/4730431.html