1.@class


可以看出Person和Card互相引用,此時如果使用#import編譯報錯!因此當使用@class在兩個類中相互聲明,編譯不會報錯!
@class和#import的區別:
2.循環retain
3.解決方法
當兩端互相引用時,應該一端用retain、一端用assign 模擬代碼如下:
/** 需求:人擁有身份證,而身份證上顯示人的信息, 設計:分別設計Person類和Card類模擬 注意:兩個類循環引用因此設置Card一端為assign */
/********************************* Person.h *************************************/#import <Foundation/Foundation.h>@class Card;@interface Person : NSObject@property (nonatomic,retain) Card *card;@end/********************************* Person.m *************************************/#import "Person.h"#import "Card.h"@implementation Person- (void)dealloc{ [_card release]; NSLog(@"Person對象被回收了"); [super dealloc];}@end/********************************* Card.h *************************************/#import <Foundation/Foundation.h>@class Person;@interface Card : NSObject// 雖然Person是類對象 但為了解決互相retain的問題 將Car的這一端的person設置成為assign@property (nonatomic,assign) Person *person;@end/********************************* Card.m *************************************/#import "Card.h"#import "Person.h"@implementation Card- (void)dealloc{ NSLog(@"Card對象被回收"); [super dealloc];}@end/********************************* main.m *************************************/#import <Foundation/Foundation.h>#import "Person.h"#import "Card.h"int main(int argc, const char * argv[]){ Person *person = [[Person alloc] init]; Card *card = [[Card alloc] init]; // 人擁有身份證 person.card = card; // 執行后card的引用計數 = 2 // 身份證上顯示的人的信息 Car中person中assign person引用計數 = 1 card.person = person; // card計數-1 [card release]; // persong引用計數 = 0 person對象要被回收了 調用 person.dealloc 方法 [person release]; return 0;}
新聞熱點
疑難解答