我有一个UIViewController
,要求Facebook登录按钮出现在屏幕上。现在,Facebook iOS按钮要求ARC关闭。
另一方面,在同一UIViewController
我使用NSTimer
显示少量照片作为背景幻灯片 - 此功能需要ARC设置。
因此,我有一个文件,其中一个组件需要ARC,而其他组件则不需要。
确切的问题在于此代码:
-(void)handleTimer {
[UIView transitionWithView:imageView duration:3 options:(UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionCurveEaseInOut) animations:^{
imageView.image = [UIImage imageNamed:[myImages objectAtIndex:imagePtr]];
} completion:nil];
if(imagePtr == (myImages.count) - 1)
imagePtr = 0;
else
imagePtr = imagePtr + 1;
}
如果我为具有此代码的文件禁用ARC,则会在此行引发错误:
imageView.image = [UIImage imageNamed:[myImages objectAtIndex:imagePtr]];
错误如下:
Thread 1 : EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
实际上,如上所示,我有时间不断更新imageView中的图像。
myImageView的类型为
@property (nonatomic, assign) IBOutlet UIImageView *imageView;
那么,这里有什么问题?
以下是在viewDidLoad()方法中初始化myImages的方法:
@interface ViewController () {
UIImage *nextImage;
NSArray *myImages;
int imagePtr;
}
@end
@implementation ViewController
@synthesize imageView;
- (void)viewDidLoad
{
[super viewDidLoad];
myImages = @[@"image1.jpg", @"image2.jpg", @"image3.jpg", @"image4.jpg", @"image5.jpg", @"image6.jpg", @"image7.jpg", @"image8.jpg", @"image9.jpg",
@"image10.jpg", @"image11.jpg", @"image12.jpg", @"image13.jpg",
@"image14.jpg", @"image15.jpg", @"image16.jpg", @"image17.jpg",
@"image18.jpg", @"image19.jpg", ];
imagePtr = 0;
NSTimer *timer;
imageView.image = [UIImage imageNamed:[myImages objectAtIndex:imagePtr]];
imagePtr = imagePtr + 1;
//imageView.image = [UIImage imageNamed:[myImages objectAtIndex:imagePtr]];
timer = [NSTimer scheduledTimerWithTimeInterval: 3
target: self
selector: @selector(handleTimer)
userInfo: nil
repeats: YES];
// Do any additional setup after loading the view, typically from a nib.
}
答案 0 :(得分:1)
您的控制器可能是在MRC下编译的。这意味着您的ivars不会保留您分配给它们的值,例如:
myImages = @[...];
将分配指针,但无论如何都会释放数组,当您稍后尝试访问myImages
时,应用程序将崩溃。
解决方案:
MRC - retain
分配到ivars时,请明确保留值(myImages = [@[...] retain];
),不要忘记release
中的-dealloc
。
MRC - 具有属性
删除你的ivars并将它们声明为属性
@property (nonatomic, retain) NSArray *myImages;
... self.myImages = @[...];
-dealloc
ARC(首选解决方案) - 使用ARC编译您的控制器,ivars中的值将隐式__strong
并保留给您。