iphone - 为什么我在 ARC 下比较桥接 CGColorRefs 时遇到崩溃?

标签 iphone objective-c ios memory-management automatic-ref-counting

我有一个用于我在我的应用程序中使用的阴影 TableView 的类。

在转换为 ARC 时,我不得不改变一些东西。对于新类,它在以下几行崩溃:(id)(inverse ? darkColor : lightColor)(__bridge id)(inverse ? lightColor : darkColor)。控制台显示 *** -[Not A Type retain]: message sent to deallocated instance 0x4cee70

之前:

- (CAGradientLayer *)shadowAsInverse:(BOOL)inverse
{
    CAGradientLayer *newShadow = [[[CAGradientLayer alloc] init] autorelease];
    CGRect newShadowFrame =
        CGRectMake(0, 0, self.frame.size.width,
            inverse ? SHADOW_INVERSE_HEIGHT : SHADOW_HEIGHT);
    newShadow.frame = newShadowFrame;
    CGColorRef darkColor =
        [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:
            inverse ? (SHADOW_INVERSE_HEIGHT / SHADOW_HEIGHT) * 0.25 : 0.25].CGColor;
    CGColorRef lightColor =
        [self.backgroundColor colorWithAlphaComponent:0.0].CGColor;
    newShadow.colors =
        [NSArray arrayWithObjects:
            (id)(inverse ? lightColor : darkColor),
            (id)(inverse ? darkColor : lightColor),
        nil];
    return newShadow;
}

之后:

- (CAGradientLayer *)shadowAsInverse:(BOOL)inverse
{
    CAGradientLayer *newShadow = [[CAGradientLayer alloc] init];
    CGRect newShadowFrame =
        CGRectMake(0, 0, self.frame.size.width,
            inverse ? SHADOW_INVERSE_HEIGHT : SHADOW_HEIGHT);
    newShadow.frame = newShadowFrame;
    CGColorRef darkColor =
        [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:
            inverse ? (SHADOW_INVERSE_HEIGHT / SHADOW_HEIGHT) * 0.25 : 0.25].CGColor;
    CGColorRef lightColor =
        [self.backgroundColor colorWithAlphaComponent:0.0].CGColor;
    newShadow.colors =
        [NSArray arrayWithObjects:
            (__bridge id)(inverse ? lightColor : darkColor),
            (__bridge id)(inverse ? darkColor : lightColor),
        nil];
    return newShadow;
}

最佳答案

Apple 的 Transitioning to ARC Release Notes 有一个标题为“编译器处理从 Cocoa 方法返回的 CF 对象”的小节,它以 CAGradientLayer.colors 为例。它说这段代码将按原样工作:

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        CAGradientLayer *gradientLayer = (CAGradientLayer *)[self layer];
        gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor],
                                                         (id)[[UIColor lightGrayColor] CGColor], nil];
        gradientLayer.startPoint = CGPointMake(0.0, 0.0);
        gradientLayer.endPoint = CGPointMake(1.0, 1.0);
    }
    return self;
}

所以也许你应该尝试像这样重写你的代码:

- (CAGradientLayer *)shadowAsInverse:(BOOL)inverse
{
    CAGradientLayer *newShadow = [[CAGradientLayer alloc] init];
    CGRect newShadowFrame =
        CGRectMake(0, 0, self.frame.size.width,
            inverse ? SHADOW_INVERSE_HEIGHT : SHADOW_HEIGHT);
    newShadow.frame = newShadowFrame;
    UIColor darkColor =
        [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:
            inverse ? (SHADOW_INVERSE_HEIGHT / SHADOW_HEIGHT) * 0.25 : 0.25];
    UIColor lightColor =
        [self.backgroundColor colorWithAlphaComponent:0.0];
    newShadow.colors = inverse
        ? [NSArray arrayWithObjects:[lightColor CGColor], [darkColor CGColor], nil]
        : [NSArray arrayWithObjects:[darkColor CGColor], [lightColor CGColor], nil];
    return newShadow;
}

关于iphone - 为什么我在 ARC 下比较桥接 CGColorRefs 时遇到崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7781993/

相关文章:

iphone - 在哪里存储 UIDocument 的预览?

iphone - 如何延迟 UIKit 中的 UINavigationController 转换?

objective-c - MobFox 总是给我回复 "No inventory for ad request"

ios - CFBundleVersion key 错误

iphone - 动态获取iOS应用程序商店中其他应用程序的信息

iphone - 相机功能在 iPhone 上不起作用

ios - 快速通过 segue 传递数据时出现问题

iphone - 通知设置中缺少“提醒样式”选项

sql - 单父实体的核心数据性能

ios - 弱引用和保留循环