ios - 如何解决此自动引用计数 (ARC) 冲突?

标签 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.
}

最佳答案

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

myImages = @[...];

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

解决方案:

  1. MRC - 带有 retain
    分配给 ivars 时,明确保留值( myImages = [@[...] retain]; ),不要忘记 release在你的-dealloc .

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

    @property (nonatomic, retain) NSArray *myImages;<p></p>
    
    

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


    同样,不要忘记在 -dealloc 中释放您的数组

  3. ARC(首选解决方案)- 使用 ARC 编译 Controller ,ivars 中的值将隐式为 __strong并为您保留。

关于ios - 如何解决此自动引用计数 (ARC) 冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24450400/

相关文章:

ios - 用于iOS测试飞行Beta测试的沙盒帐户

IOS/objective-C : UIActivityViewController: Customize for different Activity Types

iphone - 特殊字符的 NSPredicate - iPhone

ios - 可以并排运行 Fabric 和 TestFlight 应用程序吗?

ios - 这张图片使用了什么样的 View

ios - 获取对 SceneKit 目录 Swift 的引用

objective-c - 如何在 MFMailComposeViewController 中设置?

ipad - iOS 7's drawViewHierarchyInRect doesn' t 工作?

android - 结合iBeacon蓝牙低功耗与Android 4.3

iphone - iOS 7 蓝牙 - 即使手机重启后也能在后台处理事件的应用程序