簡體   English   中英

Objective-C-當我更改視圖為零時保留計數

[英]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, @propertyretain設置也是如此。

設置屬性的一般模式如下:

。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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM