c語言中
每初始化一次物件:計數器為1
釋放物件時:計數器-1
被引用的指標計數器為0時
被引用該指標的記憶體自動釋放,引用指標成為野指標除了c
語言的基本資料型別外
oc中得類都加入了物件引用計數 retaincount
1.手動管理引用計數
2.自動管理引用計數 autorelease
nsstring特殊
呼叫物件的
retian copy mutalecopy new alloc
會影響該物件的引用計數為1
呼叫物件的release autorelease會使該物件的引用計數-1
nsstring
*str1 = [[
nsstring
alloc
]init];
//不遵循**法則
即使初始化 str1.retaincount 為-1 但為了統一**法則
依然要release
nslog(@"%ld",str1.retaincount);
arc中
nsmutablestring* str = [[nsmutablestring
alloc
]init];
//只有oc的物件才有retaincount c中沒有
nslog(@"%ld",str.retaincount);//1
[str retain];
nslog(@"%ld",str.retaincount);//2
[str release];
nslog(@"%ld",str.retaincount);//1
//不寫下面
記憶體洩露
[str release];/*
記憶體管理:誰申請
誰釋放
一對一原則:引用計數+1 或-1 要平衡 */
person *p = [[person
alloc]init];
nslog(
@"count %ld"
,p.retaincount);
[pretain];
nslog(
@"count %ld"
,p.retaincount);
[prelease];
[prelease];
nsmutablestring*str2 = [[nsmutablestring
alloc
]initwithstring
:@"wahaha"];
p.str = str2;
nslog(@"%ld",str2.retaincount);//2
p.str = str2;
nslog(@"%ld",str2.retaincount);//2
[strrelease];
nslog(@"str is %@",p.str);
//如果是有兩個對它進行賦值,如果set方法單純的用self.str = str會崩掉,如果使用self.str = [str retain],那麼對它進行兩次物件的賦值的話第一次賦值的self.str空間沒有被釋放,而self.str現在指向了另乙個空間,所以原來的self.str的retain沒有被釋放所以set方法應該向person類裡面寫的那樣
nsmutablestring*str3 = [[nsmutablestring
alloc
]initwithstring
:@"aaa"];
p.str = str2;
nslog(@"%ld",str2.retaincount);//2
p.str = str3;
nslog
(@"%ld"
,str3.
retaincount
);//2,str2.retaincount變成1
person.h檔案
@property(nonatomic,retain)
nsmutablestring
*str;
person.m檔案
/*不要手動呼叫物件的dealloc方法
當該物件的引用計數為0時系統自動呼叫
物件的成員變數釋放都寫在dealloc中
*/-(void) dealloc
//點語法擴充套件
-(void)setstr:(nsmutablestring *)str }
//此方法其實保證self.str被第二個其他字串引用時,原來的字串的retain變回self.str沒有被引用的時候,就像人從a房間走到b房間,a房間的人數要減去1,再把b房間的人數增加1
-(nsmutablestring*)str
oc學習之旅 記憶體管理
因為以前的 都是使用非arc 手動管理 而arc還不太完善,因此學習非arc模式還是有必要的。在用非arc模式 引用計數器概念 oc中,在oc定義的型別都設計有乙個引用計數器retaincount。而oc中的引用分兩種,一種是強引用retain 對應arc中的strong 另一種是弱引用assign...
IOS學習 OC記憶體管理
記憶體管理 引用計數器 oc物件被引用的次數,為0的時候該物件被銷毀,記憶體 retain 引用次數 1 返回的是物件本身 release 引用次數 1 沒有返回值 retaincount 獲取引用次數。dealloc oc物件被銷毀的時候會呼叫dealloc方法,繼承該 方法 放最後面 super...
Oc 記憶體管理
1 對你自己擁有的物件負責,你只能釋放你擁有的物件 2 凡是你通過 retain alloc copy等手段獲得了所有者的物件,都必須在你不使用的時候來呼叫release autorelease等手段來釋放對他的所有權 3 在一定的 段內,對同乙個物件所作的copy alloc retain的操作次...