Почему у меня происходит сбой при сравнении мостовых CGColorRefs в ARC? - PullRequest
4 голосов
/ 16 октября 2011

У меня есть класс для теневого представления таблицы, который я использую в своем приложении.

При выполнении преобразования в 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;
}

Ответы [ 2 ]

8 голосов
/ 16 октября 2011

Apple Переход к примечаниям к выпуску ARC содержит подраздел «Компилятор обрабатывает объекты 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;
}
1 голос
/ 16 ноября 2011

Я решил эту проблему по-другому:

В Xcode, на целевой вкладке Build Phases, откройте группу, чтобы открыть Sources Compile the source file list. Дважды щелкните файл, для которого вы хотите установить флаг в сентябре, введите -fno-objc-arc на всплывающей панели, затем нажмите «Готово».

Это отключает файл ARC, только доставляет вам проблемы.

...