愚蠢的問題,但爲什麼我們需要在聲明屬性時使用'retain'?無論如何,當它被分配了一些東西時它不會被保留嗎?objective-c 2.0屬性和'保留'
看一下這個例子,似乎一個對象在分配時會自動保留,所以有什麼意義呢?
#import "Fraction.h"
#import <stdio.h>
int main(int argc, const char *argv[]) {
Fraction *frac1 = [[Fraction alloc] init];
Fraction *frac2 = [[Fraction alloc] init];
// print current counts
printf("Fraction 1 retain count: %i\n", [frac1 retainCount]);
printf("Fraction 2 retain count: %i\n", [frac2 retainCount]);
// increment them
[frac1 retain]; // 2
[frac1 retain]; // 3
[frac2 retain]; // 2
// print current counts
printf("Fraction 1 retain count: %i\n", [frac1 retainCount]);
printf("Fraction 2 retain count: %i\n", [frac2 retainCount]);
// decrement
[frac1 release]; // 2
[frac2 release]; // 1
// print current counts
printf("Fraction 1 retain count: %i\n", [frac1 retainCount]);
printf("Fraction 2 retain count: %i\n", [frac2 retainCount]);
// release them until they dealloc themselves
[frac1 release]; // 1
[frac1 release]; // 0
[frac2 release]; // 0
■輸出
級分1保留計數:1個
級分2保留計數:1個
級分1保留計數:3
級分2保留計數:2
分數1保留數:2
部分2保持數:1
Deallocing分數
Deallocing分數
這是推動我瘋了!
這樣一個方法中創建的自動釋放對象在方法返回時被釋放?我不知道..我以爲你必須autorelease它,然後它掛起,直到你釋放池? – Adam 2010-03-12 04:52:30
@Adam 這取決於NSAutoreleasePool對象已被放置到什麼位置。如果您正在創建一個非Cocoa應用程序,並且您在其中明確創建了NSAutoreleasePool,那麼在清除該池時就取決於您。但是,如果您使用的是Cocoa框架(如AppKit或UIKit),則當您創建autorelease對象時,它們將放入由Cocoa管理的池中。在運行循環期間,每隔一段時間,可可都會消耗游泳池。因此,如果您正在使用您不管理的池(例如可可),則保留在方法返回後必須存活的對象。 – 2010-03-12 05:52:52
好吧有道理 - 謝謝! – Adam 2010-03-12 06:19:49