2011-09-14 22 views
0

我試圖在我自己的NSCoding符合Class保存一個UIImage來自ABRecordRef。至於我現在我可以說,這UIImage不是NSCoding符合,所以我嘗試了下面的變通使用NSData代替:一旦通過NSCoding保存UIImage文件通過將它們轉換爲NSData

- (id)initWithRecordRef:(ABRecordRef)record{ 
    //Getting the image 
    if (ABPersonHasImageData(record)){ 
     CFDataRef imageData = ABPersonCopyImageData(record); 
     image = [UIImage imageWithData:(NSData *) imageData]; 
     CFRelease(imageData); 
    } 


    return self; 
} 

    - (void)encodeWithCoder:(NSCoder *)aCoder{ 
      //encode NSData representation from UIImage 
      tempData = UIImagePNGRepresentation(image); 
      [aCoder encodeObject:tempData forKey:@"image"]; 
     } 

    - (id)initWithCoder:(NSCoder *)aDecoder{ 
     //image 
     tempData =   [aDecoder decodeObjectForKey:@"image"]; 
     image=    [UIImage imageWithData:[tempData valueForKey:@"image"]]; 
     [tempData release]; 

     return self; 
    } 

出於某種原因,在PROGRAMM崩潰,因爲我嘗試保存這個類的一個實例。 我做錯了什麼,或者更好:我如何完成我想要的?謝謝!

回答

1

我認爲這個問題可能是你的解碼器中的[tempData release]調用。據我所知,通過分配沒有保留計數,所以它釋放了一個不應該被釋放的對象。如果這樣做不成功,我會在每種方法中設置幾個日誌語句,以查看在崩潰發生之前調用哪些日誌語句。這將給我們一個更好的主意在哪裏集中

+0

首先,沒有必要釋放,所以你在那裏正確的地方。不幸的是,這並沒有解決問題。 我試了多次,它似乎,錯誤是在這個聲明: 'image = [UIImage imageWithData:[tempData valueForKey:@「image」]];' 當我看着它,我undersood,那'valueForKey'部分是不理智的。 這部分現在工作,但現在我得到了sigarbit,如果我嘗試tu從加載的數據分配圖像到imageview ... 保存在NSCoding中的圖像,甚至這樣的工作?我究竟做錯了什麼? –

+0

發現'valueForKey:'部分是很好的。不幸的是,我忽略了這一點。你如何將圖像分配給imageView?這純粹是一種猜測,但它聽起來像是在將圖像分配給imageView之前正在釋放圖像。 – justin

+0

首先我加載我的類'RealRecord'的已保存實例,然後將圖像分配給名爲'avatarView'的UIImageview,如下所示:' - (IBAction)loadSavedContact RealRecord * myRecord = [NSKeyedUnarchiver unarchiveObjectWithFile:[self saveFilePath ]]; (myRecord == nil){NSLog(@「loading failed」); } avatarView.image = myRecord.image; // SIGARBIT發生在這裏 }對於非結構化代碼感到抱歉;不知道如何更好地發表評論。 –