【发布时间】:2013-04-18 10:52:58
【问题描述】:
我从外部类调用类方法以获得对象引用,在本例中是对 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 将被关闭。我想也许这就是我失去参考的原因。
提前感谢您的帮助!!
【问题讨论】:
-
#tumbleweeds,#crickets
-
当我使用调试器单步执行代码时,返回值在设置时具有有效地址,但随后调试器转到右大括号,然后弹回返回值,此时在控制台视图中可以看到在实际返回调用方法之前该值设置为 0x00000000。我相信 ARC 正在这样做,我不确定如何解决它。它甚至将另一个类发送的 thumbRef 的引用设置为 0。
-
尝试做 __strong UIImage* thumb = [MyOtherClass makeThumb: originalImage];看看它是否仍然为零。
-
否则尝试做 __strong UIImage *scaledThumb = ...
-
离开makeThumb方法的时候是nil,但是在调用代码中查看回来的时候有内存地址。
标签: objective-c cocoa-touch ios6 null