オブジェクト参照 (この場合は UIImage への参照) を取得するために、外部クラスからクラス メソッドを呼び出しています。正常に呼び出して内部から取得できますmyOtherClass
が、からメソッドを呼び出すと、myClass
常に nil が返されます。
@implementation myClass
...
- (UIImage *) gethThumb: (UIImage *) originalImage {
// always comes back nil:
UIImage* thumb = [MyOtherClass makeThumb: originalImage];
return thumb;
}
...
@end
@implementation MyOtherClass
...
+ (UIImage*) makeThumb: (UIImage *) fullImage {
CGSize imageSize = [fullImage size];
int shortestEdge = MIN(imageSize.width, imageSize.height);
CGRect rect = CGRectMake((imageSize.width - shortestEdge)/2, (imageSize.height - shortestEdge)/2, shortestEdge, shortestEdge);
CGImageRef imageRef = CGImageCreateWithImageInRect([fullImage CGImage], rect);
UIImage *thumb = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGSize thumbsize = CGSizeMake(180, 180);
UIGraphicsBeginImageContext(thumbsize);
[thumb drawInRect:CGRectMake(0, 0, thumbsize.width, thumbsize.height)];
UIImage *scaledThumb = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//scaledThumb is not nil here:
return scaledThumb;
}
...
@end
ステップスルーして値を観察したところ、makeThumb メソッド内で有効なメモリアドレスを指していることがわかりましたが、外部クラスへのポインタを返すと、メモリアドレスが突然 0 になりました。
インスタンスメソッドとして記述し、オブジェクトをインスタンス化してから、メソッドを呼び出してみました
thumb = [self.myInstanceOfOtherClass makeThumb: originalImage];
また、オブジェクト参照を受け入れるようにメソッドを変更します。
UIImage *thumbRef = nil;
thumb = [self.myInstanceOfOtherClass makeThumb: originalImage thumbRef:thumbRef];
-- myOtherClasss:
- (UIImage*) makeThumb: (UIImage *) fullImage thumbRef:(UIImage *) thumbRef {
...
thumbRef = scaledThumb;
...
}
...これにより、ARCがオブジェクトへの参照を失うのを防ぐことができると思いました(それがここで起こっている場合)。
私はObjective Cに比較的慣れていないので、誰かがなぜこれが起こっているのか説明してくれることを願っています. オブジェクトは、外部クラスに戻る前に割り当て解除されていますか? 参照が破棄されないように、外部クラスで強力なプロパティに変換する必要がありますか?
言い忘れました: 参照は、UIImagePickerControllerDelegate メソッド didFinishPickingMediaWithInfo のカメラ画像への参照から作成される画像を指しています。このサムが作成される前に、Camera UIView が閉じられます。おそらくこれが参照を失っている理由だと思います。
よろしくお願いします。