Autorelease
1.autorelease的基本用法
1> 會将對象放到一個自動釋放池中
2> 當自動釋放池被銷毀時,會對池子裡面的所有對象做一次release操作
3> 會傳回對象本身
4> 調用完autorelease方法後,對象的計數器不變
2.autorelease的好處
1> 不用再關心對象釋放的時間
2> 不用再關心什麼時候調用release
3.autorelease的使用注意
1> 占用記憶體較大的對象不要随便使用autorelease
2> 占用記憶體較小的對象使用autorelease,沒有太大影響
4.标準寫法
1> alloc之後調用了autorelease,又調用release
@autoreleasepool
{
Person *p = [[[Person alloc] init] autorelease];
// 錯誤
[p release];
}
2> 連續調用多次autorelease
@autoreleasepool
{
Person *p = [[[[Person alloc] init] autorelease] autorelease];
}
5.自動釋放池
1> 在iOS程式運作過程中,會建立無數個池子。這些池子都是以棧結構存在(先進後出)
2> 當一個對象調用autorelease方法時,會将這個對象放到棧頂的釋放池
6.自動釋放池的建立方式
1> iOS 5.0前
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool release]; // [pool drain];
2> iOS 5.0 開始
@autoreleasepool
{
}
标準寫法
void test()
{
@autoreleasepool
{ // { 開始代表建立了釋放池
// autorelease方法會傳回對象本身
// 調用完autorelease方法後,對象的計數器不變
// autorelease會将對象放到一個自動釋放池中
// 當自動釋放池被銷毀時,會對池子裡面的所有對象做一次release操作
Person *p = [[[Person alloc] init] autorelease];
p.age = 10;
@autoreleasepool
{
Person *p2 = [[[Person alloc] init] autorelease];
p2.age = 10;
}
Person *p3 = [[[Person alloc] init] autorelease];
} // } 結束代表銷毀釋放池
}
=============================================================
autorelease的應用
1.系統自帶的方法裡面沒有包含alloc、new、copy,說明傳回的對象都是autorelease的
2.開發中經常會提供一些類方法,快速建立一個已經autorelease過的對象
1> 建立對象時不要直接用類名,一般用self
+ (id)person
{
return [[[self alloc] init] autorelease];
}
+ (id)person
{
return [[[self alloc] init] autorelease];
}
+ (id)personWithAge:(int)age
{
Person *p = [self person];
p.age = age;
return p;
}
@autoreleasepool
{
Person *p = [Person personWithAge:100];
p2.money = 100;
}
=============================================================
Arc的基本使用
1.ARC特點
1> 不允許調用release、retain、retainCount
2> 允許重寫dealloc,但是不允許調用[super dealloc]
3> @property的參數
* strong :成員變量是強指針(适用于OC對象類型)
* weak :成員變量是弱指針(适用于OC對象類型)
* assign : 适用于非OC對象類型
4> 以前的retain改為用strong
指針分2種:
1> 強指針:預設情況下,所有的指針都是強指針 __strong
2> 弱指針:__weak
在Arc中,定義弱指針是沒有意義的寫法
__weak Person *p = [[Person alloc] init];
=============================================================
Arc中的循環引用
當兩端循環引用的時候,解決方案:
1> ARC
1端用strong,另1端用weak
@property (nonatomic, strong) Dog *dog;
2> 非ARC
1端用retain,另1端用assign