你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS 基本內存管理系列 3-循環retain和@class

iOS 基本內存管理系列 3-循環retain和@class

編輯:IOS開發綜合
1.@class   使用場景:對於循環依賴關系來說,比方A類引用B類,同時B類也引用A類;       可以看出Person和Card互相引用,此時如果使用#import編譯報錯!因此當使用@class在兩個類中相互聲明,編譯不會報錯!   用法:使用 @class 類名; 就可以引用一個類,說明一下它是一個類 @class和#import的區別:   #import方式會包含被引用類的所有信息,包括被引用類的變量和方法;@class方式只是告訴編譯器在A.h文件中 B *b 只是類的聲明,具體這個類裡有什麼信息,這裡不需要知道,等實現文件中真正要用到時,才會真正去查看B類中信息 如果有上百個頭文件都#import了同一個文件,或者這些文件依次被#improt,那麼一旦最開始的頭文件稍有改動,後面引用到這個文件的所有類都需要重新編譯一遍,這樣的效率也是可想而知的,而相對來 講,使用@class方式就不會出現這種問題了 在.m實現文件中,如果需要引用到被引用類的實體變量或者方法時,還需要使用#import方式引入被引用類     2.循環retain   比如A對象retain了B對象,B對象retain了A對象 這樣會導致A對象和B對象永遠無法釋放 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;
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved