国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

iOS非ARC基本內存管理系列2-多對象內存管理(1)

2019-11-14 20:37:38
字體:
來源:轉載
供稿:網友

單個對象的內存管理非常簡單無非就是alloc對應release,retain對應release。但是如果涉及到很多對象,而且對象與對象有聯系的時候該怎么去管理對象的內存呢。

比如同樣一本書有好3個人購買,那意味著3個人都在引用這本書。在內存中如圖所示:

那么如果Person對象引用Book對象的話就必須給Book對象的引用計數+1,如果不再引用Book對象就要把Book對象中的引用計數減1。遵循"有加必有減"

1.多對象內存管理原則分析

  • 只要還有人在使用某個對象,那么這個對象就不會被回收
  • 只要你想用這個對象,就讓對象的計數器+1
  • 當你不再使用這個對象時,就讓對象的計數器-1
  • 只要有人在使用書,那書就不會釋放

2.誰創建誰release

如果通過alloc、new或[mutable]copy來創建一個對象,那么必須調用release或autorelease

換句話說,不是你創建的,就不用你去[auto]release

3.誰retain誰release

只要你調用了retain,無論這個對象是如何生成的,你都要調用release

4.總結原則

  • 有始有終,有加就有減
  • 曾經讓對象的計數器+1,就必須在最后讓對象計數器-1

5.代碼實現

/*      需求:有連個類Person類和Book類,實現讓Person類獲取到Book,也就是人要獲取書;      如果Person類對象釋放那么Book類對象也必須釋放,也就是說一旦人沒了,書也就沒了  設計類:既然人要占有書,那么可以在人中包含一個書類型,然后讓實際的書給人中的書賦值那么人就擁有書了 */

內存結構如圖:

 

代碼實現:

/********************************** Person.h文件 *********************************/#import "Book.h"#import <Foundation/Foundation.h>@interface Person : NSObject{    // 既然人要擁又書,那么在Person類定義一個Book類型的成員變量 _book    Book *_book;}// @PRoperty會隱藏底層內存管理 因此先不使用@property便于查看底層實現// @property Book *book;// 通過set方法為Person中的_book傳入實際的book- (void)setBook:(Book *)book;- (Book *)book;@end/********************************** Person.m文件 *********************************/#import "Person.h"@implementation Person// 為Person中的_book傳入Book對象 類似于給了Person中的_book給了一本書- (void)setBook:(Book *)book{    // 既然人已經擁有了書 那么書的引用計數必須+1 因此調用書的retain方法    _book = [book retain];    NSLog(@"人擁有書了");}- (Book *)book{    return _book;}// Person類對象在回收前調用方法- (void)dealloc{    [_book release];    NSLog(@"Person對象被回收");        [super dealloc];}@end/********************************** Book.h文件 *********************************/#import <Foundation/Foundation.h>@interface Book : NSObject@end/********************************** Book.m文件 *********************************/#import "Book.h"@implementation Book// Book類對象在回收前調用方法- (void)dealloc{    NSLog(@"Book對象被回收");        [super dealloc];}@end/********************************** main文件 *************************************/#import <Foundation/Foundation.h>#import "Book.h"#import "Person.h"int main(int argc, const char * argv[]){    Person *p = [[Person alloc] init];        Book *b = [[Book alloc] init];        // 為Person類對象中的_book傳入實際的Book對象    [p setBook:b];        // 釋放Person類對象    [p release];        // 既然Person類對象已經釋放那么清除掉指向Person類對象的指針    p = nil;        // 既然Person類已經不可用了那么Book類對象也應該釋放    [b release];        // 清空指向Book類對象的指針    b = nil;        return 0;}

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洛川县| 永登县| 西贡区| 洛川县| 绥宁县| 通河县| 巴东县| 保靖县| 梁平县| 舟山市| 景洪市| 凌海市| 高密市| 工布江达县| 徐闻县| 张家川| 麻城市| 南郑县| 西宁市| 抚州市| 卫辉市| 靖远县| 来凤县| 景洪市| 陇西县| 金华市| 青川县| 临湘市| 南京市| 洮南市| 云梦县| 体育| 漳州市| 任丘市| 旬邑县| 南京市| 丹凤县| 旬邑县| 怀远县| 黄石市| 华池县|