我有一个 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.
}
最佳答案
您的 Controller 可能是在 MRC 下编译的。这意味着您的 ivars 不会保留您分配给它们的值,例如:
myImages = @[...];
将分配指针,但数组无论如何都会被释放,当您尝试访问 myImages
时稍后,应用程序将崩溃。
解决方案:
MRC - 带有
retain
分配给 ivars 时,明确保留值(myImages = [@[...] retain];
),不要忘记release
在你的-dealloc
.MRC - 具有属性
删除您的 ivar 并将它们声明为属性@property (nonatomic, retain) NSArray *myImages;<p></p>
... self.myImages = @[...];
同样,不要忘记在-dealloc
中释放您的数组ARC(首选解决方案)- 使用 ARC 编译 Controller ,ivars 中的值将隐式为
__strong
并为您保留。
关于ios - 如何解决此自动引用计数 (ARC) 冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24450400/