[英]Objective-c - Retain Count when I change View go to zero
我像這樣在一個viewcontroller中聲明了一個UIImage和一個UIImage View:
在.h文件中:
UIImageView* itemImageView;
UIImage* itemImage;
@property (nonatomic, retain) UIImage* itemImage;
@property (nonatomic, retain) UIImageView* itemImageView;
在.m文件中:
@synthesize itemImage, itemImageView;
在另一個視圖中,我設置其值:
UIImage *image = [UIImage imageNamed:@"name1.png"];
imgView.itemImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];
imgView.itemImageView.image = image;
[self.parentViewController.view addSubview:imgView.itemImageView];
[self dismissModalViewControllerAnimated:YES];
在此方法內部,itemImageView的保留計數為2。
但是,當我回到放置屬性和合成的視圖時,保留計數為0,因此無法訪問該對象。
知道發生了什么嗎?
您的代碼看起來不錯。 (除了內存泄漏),您正在為itemImageView分配一個保留計數為+1的ImageView,它將增加為兩個。 將其設置為itemImageView后,需要在ImageView上調用release:
UIImageView* iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];
imgView.itemImageView = iv;
[iv release];
但是,這不能解決您的問題(甚至會使問題更糟。)您可以顯示更多代碼嗎? 您是否嘗試過使用調試器逐步調試它?
您的問題是與此行:
[self.parentViewController.view addSubview:imgView.itemImageView];
應該最有可能這樣編輯它:
[self.parentViewController.view addSubview:self.parentViewController.itemImageView];
這就引出了imgView是否真的等同於parentViewController.view的問題。 如果您希望做到這一點,則需要弄清楚分配的位置,然后弄清楚它在哪里。 如果沒有,那么除了在分配它之前將其用於建立對象的臨時容器之外,將其用於任何其他用途都沒有意義。
編輯:內存泄漏是一個單獨的問題,但是我不確定您如何在方法中聲明imgView,所以我留給您解決:)
UIImageView* itemImageView;
...
@property (nonatomic, retain) UIImageView* itemImageView;
...
imgView.itemImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];
這會導致雙重保留,因為alloc
將保留計數器增加1, @property
的retain
設置也是如此。
設置屬性的一般模式如下:
。H:
SomeClass* someClass;
...
@property (nonatomic, retain) SomeClass* someClass;
.m:
SomeClass* temporarySomeClass = [[SomeClass alloc] init];
self.someClass = temporarySomeClass;
[temporarySomeClass release];
...
在這里,我們使用一個臨時變量來保存分配的對象,然后立即進行釋放。
您肯定會在Apple示例代碼中看到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.