簡體   English   中英

將UIImage分配給UIImageView.image后崩潰

[英]Crash after assign UIImage to UIImageView.image

在我的代碼中:

* .h文件

UIImageView*    imgFACE;
UIImage*        imgF;
UIImage*        imgG;

初始化:

imgF = [UIImage imageNamed: @"f.png"];
imgG = [UIImage imageNamed: @"g.png"];

UIImageView *img;
img = [[UIImageView alloc]initWithFrame:FACE_RECT];
[self addSubview:img];
self.imgFACE = img;
[img release];

在drawRect中,經常:

NSLog(@"[%@]", imgF);
if(something) self.imgFACE.image = imgF;
else          self.imgFACE.image = imgG;

NSLog的標准結果是:

[<UIImage: 0x5db6b0>]

有時這段簡單的代碼會導致崩潰,NSLog的結果很奇怪:

[Length 4 (2 blocks, 1 used, block 0 is at 0) 4 0x146d22c0 
{ NSColor =  "UIDeviceWhiteColorSpace 0 1"; 
  NSFont = "<UICTFont: 0x1454fc00> font-family: \".HelveticaNeueInterface-M3\"; 
  font-weight: normal; font-style: normal; font-size: 12.00pt"; 
  NSParagraphStyle = "Alignment 0, LineSpacing 0, ParagraphSpacing 0,
  ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0,
  LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 4, Tabs (\n 28L,\n 56L,
  \n 84L,\n 112L,\n 140L,\n 168L,\n 196L,\n 224L,\n 252L,\n 280L,\n 308L,\n 336L\n),
  DefaultTabInterval 0, Blocks (null), Lists (null), BaseWritingDirection -1, 
  HyphenationFactor 0, TighteningFactor 0, HeaderLevel 0"; 
  NSShadow = "NSShadow {0, -1} color = {(null)}"; } 

什么是物體?

崩潰日志:

0libobjc.A.dylib 0x3b393b26 objc_msgSend + 5
1NOM2 0x000ad7a5 -[PanelInfoView myTimerMethod] (PanelInfoView.m:527) + 309157
2Foundation 0x319a3ecd __NSFireTimer + 64
3CoreFoundation 0x30f8b0e7 <redacted> + 14
4CoreFoundation 0x30f8acff <redacted> + 782
5CoreFoundation 0x30f8909b <redacted> + 1210
6CoreFoundation 0x30ef3ce7 CFRunLoopRunSpecific + 522
7CoreFoundation 0x30ef3acb CFRunLoopRunInMode + 106
8GraphicsServices 0x35c14283 GSEventRunModal + 138
9UIKit 0x33795a41 UIApplicationMain + 1136
10NOM2 0x0006e44d main (main.m:25) + 50253

我認為這是內存泄漏的結果。 imgF和imgG僅初始化一次。

這個UIImage會發生什么?

imgF = [UIImage imageNamed: @"f.png"];
imgG = [UIImage imageNamed: @"g.png"];

這兩個都是自動釋放的對象,

if(something) self.imgFACE.image = imgF;
else          self.imgFACE.image = imgG;

如果沒有,那么如果您很幸運並且尚未發布imgG,則imgFACE將保留imgG,但是仍然沒有任何人保留imgF,因此在下一個drawRect中,可以確定它會在NSLog(@“上崩潰。 [%@]”,imgF),或者如果幸運地在該地址上分配了其他對象,則僅打印該對象。

采用:

imgF = [[UIImage imageNamed: @"f.png"] retain];
imgG = [[UIImage imageNamed: @"g.png"] retain];

並在dealloc中釋放它們:

- (void)dealloc {
     [imgF release];
     [imgG release];

     // cleanup other resources too

     [super dealloc];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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