1. 程式人生 > >黑馬程式設計師------OC基礎-----記憶體管理

黑馬程式設計師------OC基礎-----記憶體管理

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------

法則
誰建立記憶體誰就要釋放記憶體
管理機制
引用計數器
1使用alloc(相當於C語言中的malloc)為物件分配記憶體,使用dealloc(相當與C語言中的free)釋放物件所佔有的記憶體
2使用alloc new或者copy構造物件時,物件的retainCount為1
3呼叫物件retain方法可以增加1 reatainCount
4呼叫物件的release方法可以減少1 reatainCount
程式碼如下
.h檔案

#import


@interface Student : NSObject
@property(assign,nonatomic)int age;
@property(retain,nonatomic)NSString *name;//因為在屬性添加了retain相當於為name的計數器+1所以得用dealloc來釋放
@end



.m檔案
#import "Student.h"


@implementation Student
@synthesize name,age;
-(void)dealloc{//防止指標洩漏
    self.name=nil;
    [super dealloc];
}
@end
main函式
#import
#import "Student.h"
int main(int argc, const char * argv[])
{


    @autoreleasepool {
       
        Student *stu=[[Student alloc]init];
       
         NSLog(@"%ld",[stu retainCount]);
        [stu retain];
        NSLog(@"%ld",[stu retainCount]);
        [stu release];
         NSLog(@"%ld",[stu retainCount]);
        [stu autorelease];
        NSLog(@"%ld",[stu retainCount]);//會在結束時才會-1
    }
    return 0;
}


5當物件的retainCount為0時,dealloc會自動呼叫,釋放物件記憶體,否則分配給物件的記憶體將被一直佔用
NSString *[email protected]"hello";
記憶體釋放原則
1 物件又建立,就會又摧毀,而且使用後,應立即relesse
2.凡是出現alloc copy retain的地方,都會有一個release或autorelease對應
3用便利構造器建立的物件不能用release,該物件由autorelease管理記憶體;
4一定不要釋放沒有所有權的物件


幾個關鍵字可能影響到記憶體管理(影響記憶體或者記憶體記數)
retain                                  不影響           影響   
release                                不影響           影響
alloc                                    影響             影響
doalloc                                 釋放            影響(將例項變數清零)
autorelease                         不影響        (自動釋放池結束時,進行-1動作)           
assign                                不影響           不影響


設定器的重現
當你寫在.h檔案寫了@property(retain,nonatomic)Student *stu;
        在.檔案中寫了 @synthesize stu;
系統將自動生成
if(stu!=stu){
    [stu release]
    stu=[newstu retain]
}


自動生成這段程式碼的作用:保持對新傳入的物件的所有權,同時放棄對舊物件的所有權,可防止自己要呼叫的東西被提前釋放

NSString *[email protected]"hello";
        NSLog(@"%ld",[str retainCount]);


打印出來的值是-1  因為hello存在常量區裡 被設定成最大值 不會被release

相關推薦

黑馬程式設計師 OC基礎: 記憶體管理

記憶體管理 簡述 每個 oc 物件都有自己的引用計數器,是一個整數,表示”物件被引用的次數”.佔四位元組 計數器預設值為1 當為0時,物件佔用的記憶體會被系統回收. 引用的操作 給物件傳送一條 retain 計數器+1 給物件傳送一

黑馬程式設計師——OC基礎記憶體管理

=== 記憶體管理機制 === OC的區域性變數在程式碼塊結束時被系統銷燬, 記憶體被回收. OC的物件, 內部有引用計數器, 當引用計數器的值為0時, 被系統銷燬, 記憶體被回收. 區域性變數存放在棧中. 物件存放在堆中. 注意, 物件指標還是存放在棧中, 物件本身佔用的記憶體存放在堆中. 在OC

黑馬程式設計師——OC基礎---記憶體管理

1. 控制set方法的記憶體管理 retain : release舊值,retain新值(用於OC物件)  assign : 直接賦值,不做任何記憶體管理(預設,用於非OC物件型別) copy   : release舊值,copy新值(一般用於NSString *) 2.  控制需不需生成set方法 re

黑馬程式設計師——OC基礎——記憶體管理(一)

一,為什麼要進行記憶體管理 1,由於移動裝置的記憶體有限,所以每個APP所佔的記憶體也是有限制的,當APP所佔用的記憶體較多時,系統就會發出警告,這時就需要回收一些不需要繼續使用的記憶體空間,比如回收一些不再使用的物件和變數等。 任何繼承NSObject的物件,對其他的基

黑馬程式設計師------OC基礎-----記憶體管理

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! ------- 法則 誰建立記憶體誰就要釋放記憶體 管理機制 引用計數器 1使用alloc(相當於C語言中的malloc)為物件分配記憶體,使用dealloc(相當與C語言中的fre

黑馬程式設計師——OC記憶體管理

1.記憶體的建立和釋放 讓我們以Object-c世界中最最簡單的申請記憶體方式展開,談談關於一個物件的生命週期。首先建立一個物件: id testObject = [[ClassName alloc] init]; //“ClassName”是任何你

黑馬程式設計師--OC基礎--類方法、物件方法和self的使用

1、類方法 (1)類方法就是一個方法,它的使用不需要使用者去建立一個類的例項進行呼叫而可以直接通過類名對方法進行呼叫。 宣告一個類方法的格式: +(返回值型別) 方法名:(引數1型別)引數1名稱 方法名:(引數2型別)引數2名稱; 例:

黑馬程式設計師——OC基礎——set方法和get方法

-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 我們在OC中定義一個類的時候,它的成員變數預設情況下是@protected的。這是因為我們的成員變數一般不允許直接去訪問,如果需要修改和訪問成員變數我們

黑馬程式設計師——OC基礎——構造方法

-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 前面我們用OC的類建立物件的時候我們用的是new方法。其實new方法是一個組合的方法,它是由兩個方法組合在一塊的,分別是alloc方法和init方法。其

黑馬程式設計師——OC基礎---Foundation框架之結構體

一、概述 Foundation—基礎框架。框架中包含了很多開發中常用的資料型別,如結構體,列舉,類等,是其他ios框架的基礎。 如果要想使用foundation框架中的資料型別,那麼包含它的主標頭檔案就可以了。 即#import #import &l

黑馬程式設計師_OC之記憶體管理

記憶體管理 ------ IOS培訓、android培訓、期待與您交流!------- 一、基本原理:    1、記憶體管理的定義       1>、移動移動裝置的記憶體極其有限,每個app所能佔用的記憶體是有限制的       2>、當app所佔用的記憶體

黑馬程式設計師--OC基礎[email protected]和@synthesize

1、@property關鍵字 (1)基本概念 @property是編譯器指令,所謂編譯器指令,就是告訴編譯器要做什麼。 @property告訴編譯器宣告屬性的訪問器(setter/getter)方法,這樣的好處是免去了程式設計師編寫set和get的

黑馬程式設計師OC語言基礎記憶體管理

之前我們已經提到過C語言中的記憶體儲存空間。有五大區域:堆、棧、自由儲存區、全域性\靜態儲存區和常量儲存區。 OC是以C語言為基礎的,所以也分這五大區域。 下面我們討論一下OC中記憶體管理的規律。 一、引用計數器 1.每個OC物件都有自己的引用計數器,是一個整數,即物件被

黑馬程式設計師——IOS基礎——OC記憶體管理

=====================引用計數器開始==================== 基本型別資料存放在棧中,物件存放在堆中 棧中的資料系統自動回收 堆空間中的資料動態分配,不能自動分配,容易引起記憶體洩露 需要給物件傳送訊息,讓它回收,即呼叫物件的回收方法

黑馬程式設計師————OC記憶體管理_筆記整理(二)

一、@Prpperty引數 // 加上retain:表示生成的set方法,release舊值,retain新值 @property (retain) Book *book; // oc物件型別 //@property (nonatomic,retain) 類名 *屬性名

黑馬程式設計師-OC學習筆記-----記憶體管理

移動裝置的記憶體極其有限,每個app所能佔用的記憶體是有限制的.當app所佔用的記憶體較多時,系統會發出記憶體警告,這時得回收一些不需要再使用的記憶體空間。比如回收一些不需要使用的物件、變數等。基本的資料型別是放在記憶體的棧裡面,這是不需要我們去管理的,系統會自動回收。但是

黑馬程式設計師——OC筆記之記憶體管理

Objective-C提供了三種記憶體管理方式: MannulReference Counting(MRC,手動管理, iOS4.1之前的版本) automatic reference counting(ARC,自動引用計數,iOS4.1 之後推出的) garbage collection(垃圾回收)。iO

[黑馬程式設計師][OC]記憶體管理

一、記憶體管理的基本原理 1.什麼是記憶體管理 移動裝置的記憶體極其有限,每個app所能佔用的記憶體是有限制的,當app所佔用的記憶體較多時,系統會發出記憶體警告,這時得回收 一些不需要再使用的記憶體空間。比如回收一些不需要使用的物件、變數等。管理範圍:任何繼承了NS

黑馬程式設計師————OC記憶體管理_ARC

ARC( Autom Reference Counting) 是一個編譯器特性,會自動檢測幫我們release 一、ARC基本原理 1.編譯器特性 編譯程式碼的過程中會自動檢測哪裡需要插入自動釋放記憶體的程式碼 // 新建立一個物件,會自動釋放物件 P

黑馬程式設計師-----OC記憶體管理原則

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- Objective-C對記憶體管理的方法