如何解决此自动参考计数(ARC)冲突?

时间:2014-06-27 11:11:11

标签: ios objective-c ios7 automatic-ref-counting

我有一个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.
}

1 个答案:

答案 0 :(得分:1)

您的控制器可能是在MRC下编译的。这意味着您的ivars不会保留您分配给它们的值,例如:

myImages = @[...];

将分配指针,但无论如何都会释放数组,当您稍后尝试访问myImages时,应用程序将崩溃。

解决方案:

  1. MRC - retain
    分配到ivars时,请明确保留值(myImages = [@[...] retain];),不要忘记release中的-dealloc

  2. MRC - 具有属性
    删除你的ivars并将它们声明为属性

    @property (nonatomic, retain) NSArray *myImages;

    ... self.myImages = @[...];


    再次,不要忘记在-dealloc

  3. 中发布您的数组
  4. ARC(首选解决方案) - 使用ARC编译您的控制器,ivars中的值将隐式__strong并保留给您。