我是iPhone編程的新手。我在編程中沒有使用Interface Builder。我對內存管理有些疑問,iPhone中的@property主題。 考慮下面的代碼iPhone內存管理
@interface LoadFlag : UIViewController {
UIImage *flag;
UIImageView *preview;
}
@property (nonatomic, retain) UIImageView *preview;
@property (nonatomic, retain) UIImage *flag;
...
@implementation LoadFlag
@synthesize preview;
@synthesize flag;
- (void)viewDidLoad
{
flag = [UIImage imageNamed:@"myImage.png"]];
NSLog(@"Preview: %d\n",[preview retainCount]); //Count: 0 but shouldn't it be 1 as I am retaining it in @property in interface file
preview=[[UIImageView alloc]init];
NSLog(@"Count: %d\n",[preview retainCount]); //Count: 1
preview.frame=CGRectMake(0.0f, 0.0f, 100.0f, 100.0f);
preview.image = flag;
[self.view addSubview:preview];
NSLog(@"Count: %d\n",[preview retainCount]); //Count: 2
[preview release];
NSLog(@"Count: %d\n",[preview retainCount]); //Count: 1
}
...
當&爲什麼(什麼是需要)我必須設置@property與保留(在
UIImage
&UIImageView
上述情況)?我在很多示例程序中看到了這種說法,但並不瞭解它的必要性。當我聲明
@property (nonatomic, retain) UIImageView *preview;
聲明時,保留計數爲0.爲什麼它不增加1,儘管它保留在@property中。另外當我聲明
[self.view addSubview:preview];
然後再保留計數增量1。在這種情況下,「Autorelease pool」會在稍後發佈,否則我們必須注意釋放它。我不確定,但我認爲Autorelease應該處理它,因爲我們沒有明確保留它,所以我們爲什麼要擔心釋放它。現在,
[preview release];
聲明後,我的數爲1。現在我並不在我的計劃需要UIImageView
了,所以何時何地,我應該釋放使得計變爲0,內存被釋放。再次,我不確定,但我認爲Autorelease應該處理它,因爲我們沒有明確保留它,所以我們爲什麼應該擔心釋放它。如果我在-(void) dealloc
中釋放它會發生什麼?在聲明 - >
flag = [UIImage imageNamed:@"myImage.png"]];
我沒有分配任何內存來標記,但我怎麼能仍然在我的程序中使用它。在這種情況下,如果我不分配內存,那麼誰分配內存,或者是「標誌」,只是指向 - >[UIImage imageNamed:@"myImage.png"]];
的引用。如果它只是一個參考,那麼我是否需要釋放它。
第一個事實:不要信任RETAINCOUNT! – jv42 2011-01-14 12:44:57
爲什麼不呢?誠然,不要爲此而煩惱,尤其是。具體的價值,但只要你沒有多個線程運行,訪問你的東西,你可以使用它作爲一個指標,如果你已經創建了泄漏。這是多重指標之一,這不一定是理想的指標。 – 2011-01-14 12:47:51
不是; `retainCount`沒用,總會有更好的方法。總是。只要您通過任何系統API傳遞任何對象,保留計數就很可能會發生變化,通常無法查看源代碼的方式無法估計。 – bbum 2011-01-14 18:04:02