2010-08-05 45 views
0

UIImage * image = [[UIImage alloc] initWithData:data]; ((YKSubCategory *)[_ subCategories objectAtIndex:connection.tag - 1])。menuImage = image; [image release];在Objective-C中的屬性的內存問題

這是我寫的代碼。數據存在並創建設計圖像。 (我用imageview測試過它,圖像出現)。 當我嘗試設置menuImage屬性時出現問題。它不會被設置。我不知道爲什麼。所以menuImage屬性的值仍然爲零。 這裏是屬性定義:

@property (nonatomic, retain) UIImage *menuImage; 

什麼可以是問題?


編輯:

我分了代碼是WalkyTalky的請求。 這裏是我寫的代碼:

UIImage *image = [[UIImage alloc] initWithData:data]; 
YKSubCategory *subCategory = (YKSubCategory *)[_subCategories objectAtIndex:connection.tag - 1]; 
subCategory.menuImage = image; 
[image release]; 
[_tableView reloadData]; 

所以現在有趣的是,輔類型變量是我所期望的變量。然後,我設置menuImage屬性後,該屬性的變量設置。我可以在調試器中看到,但在數組中沒有設置。這是什麼?

回答

1

(i)你有沒有@synthesize -d menuImage? (ii)您是否可以拆分setter行以首先獲取YKSubCategory對象並測試它是否存在,是您的期望?

YKSubCategory* target = (YKSubCategory*)[_subCategories objectAtIndex:connection.tag - 1]; 
NSLog("subcategory target = %@", target); 
// other tests here 
target.menuImage = image; 

否則,我認爲我們沒有足夠的信息來解決這個問題。 menuImage設置後立即看起來像什麼?


編輯:當你說「的陣列中,在未設置」,你的意思是數組中的實際對象從你剛剛設置在那裏,然後將一個不同?或者當您加載表格數據時回到陣列,menuImage不再設置?或者它只是不顯示在表格中?第一個看起來是不可能的,所以讓我們來考慮第二個和第三個。

如果menuImage在你回到它的時候已經被重置,那麼必須有一些代碼將它設置在某個地方。這可能不是去通過屬性訪問器,但對於初學者,你可以明確的實施二傳手將更改記錄:

- (void) setMenuImage:(UIImage*)newImage 
{ 
    if (newImage != menuImage) 
    { 
     NSLog(@"Changing menuImage from %@ to %@", menuImage, newImage); 
     [newImage retain]; 
     [menuImage release]; 
     menuImage = newImage; 
    } 
} 

另一種可能是,實際YKSubCategory對象數組中已經改變,甚至認爲陣列不同,所以檢查兩個位置的指針是否相同。

另一方面,如果菜單圖像ivar 設置,但它沒有顯示在表中,您需要檢查您的圖形代碼。

+0

是的,我合成了。等一下。我會分手。 – 2010-08-05 08:03:03

+0

我的繪圖代碼出現錯誤。謝謝! – 2010-08-08 07:37:15