Сбой при передаче UIColor в качестве аргумента - PullRequest
2 голосов
/ 22 июня 2010

У меня есть небольшой объект UIView, CircleColorView.m, который просто создает вид с цветным кругом внутри.Затем я использую этот вид в качестве фона для набора кнопок (всех разных цветов).

Моя проблема возникает, когда вызывается метод drawRect :.Я сбой, но только иногда, когда я ссылаюсь на цвет объекта, который является UIColor.

Я очень смущен.Вот мой UIView:

ColorCircleView.h

#import <UIKit/UIKit.h>
#import "Constants.h"

@interface CircleColorView : UIView {

    UIColor *color;

}

@property (nonatomic, retain) UIColor *color;

- (id)initWithFrame:(CGRect)frame andColor:(UIColor *)circleColor;

@end

А вот ColorCircleView.m

#import "CircleColorView.h"


@implementation CircleColorView
@synthesize color;

- (id)initWithFrame:(CGRect)frame andColor:(UIColor *)circleColor {
    if ((self = [super initWithFrame:frame])) {
        color = [UIColor colorWithCGColor:[circleColor CGColor]];

                // have also tried
                // color = circleColor;


    }

    return self;
}


- (void) drawRect: (CGRect) aRect
{
    CGFloat iconSize = self.frame.size.width;

        // Create a new path
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGMutablePathRef path = CGPathCreateMutable();

        // Set up fill for circle
    const CGFloat* fill = CGColorGetComponents(color.CGColor);
    CGContextSetFillColor(context, fill);

        // Add circle to path
    CGRect limits = CGRectMake(8.0f, 8.0f, iconSize - 16.0f, iconSize - 16.0f);
    CGPathAddEllipseInRect(path, NULL, limits);
    CGContextAddPath(context, path);

    CGContextFillEllipseInRect(context, limits);
    CGContextFillPath(context);
    CFRelease(path);
}




- (void)dealloc {
    [color release];
    [super dealloc];
}


@end

Вот код, который я использую для создания и добавленияCircleColorView для изображения кнопки.Он находится внутри цикла, который проходит через массив строк со значениями цвета, разделенными символом;

NSArray *values = [[NSArray alloc] initWithArray:[[[colorListArray objectAtIndex:i] objectAtIndex:1] componentsSeparatedByString:@";"]];
    float red = [[values objectAtIndex:0] floatValue];
    float green = [[values objectAtIndex:1] floatValue];
    float blue = [[values objectAtIndex:2] floatValue];

    UIColor *color = [[UIColor alloc]
                      initWithRed: (float) (red/255.0f)
                      green: (float) (green/255.0f)
                      blue:  (float) (blue/255.0f)
                      alpha: 1.0];
    UIButton *newColorButton = [UIButton buttonWithType:0];

        //Create Colored Circle
    CircleColorView *circle = [[CircleColorView alloc] initWithFrame:CGRectMake(0, 0, 75, 75) andColor:color ];
    circle.backgroundColor = [UIColor clearColor];

       //Set Button Attributes
    [newColorButton setTitle:[[colorListArray objectAtIndex:i] objectAtIndex:1] forState:UIControlStateDisabled];
    [newColorButton setFrame:CGRectMake(600+(i*82), 12, 75, 75)]; //set location of each button in scrollview
    [newColorButton addTarget:self action:@selector(changeColor:) forControlEvents:UIControlEventTouchDown];
    [newColorButton setTag:tagNum];
    [barContentView addSubview:newColorButton];
    [circle release];
    [color release];
    [values release];

Я зарегистрировал его, чтобы увидеть, что происходит.Похоже, что он запускает CircleColorView initWithFrame: andColor: просто отлично.Затем при вызове drawRect: произойдет сбой при первом обращении к свойству color.Даже если он просто просит его описать как [описание цвета].

Любые идеи.Я создаю этот цвет UIColor * неправильно?Или сохранить это неправильно?Вот еще одна странная вещь.Этот код работает нормально некоторое время.Затем, когда я выйду и перезапущу приложение, оно будет зависать.Чтобы заставить его работать снова, я удалил файл сборки и папку приложения в симуляторе iPhone.Это позволит ему снова работать.Единственное, что постоянно заставит его работать, - это просто изменив UIColor * color @property для присваивания или наоборот.Это позволит мне перестроить приложение и запустить его без проблем один или два раза.Тогда это терпит крах.О, и он делает то же самое на устройстве.Есть идеи???

Заранее спасибо,

Марк

Ответы [ 3 ]

4 голосов
/ 22 июня 2010

Эта строка объявляет свойство цвета, которое будет сохранять цвет при назначении.

@property (nonatomic, retain) UIColor *color;

Эта строка обходит установщик свойств и присваивает объекту с автоматическим освобождением непосредственно член.

color = [UIColor colorWith...

Вы можете исправить это с помощью:

self.color = [UIColor colorWith...

или

[color retain];

или

color = [[UIColor alloc] initWith...
2 голосов
/ 22 июня 2010

Поскольку вы присваиваете непосредственно «цвет», а не используете «.» в синтаксисе метода доступа метод set не вызывается, поэтому назначаемое вами значение не сохраняется.

Вам нужно либо явно сохранить color, либо использовать. Синтаксис:

self.color = [UIColor colorWithCGColor:[circleColor CGColor]];
1 голос
/ 22 июня 2010
color = [UIColor colorWithCGColor:[circleColor CGColor]];
[color retain];

При отсутствии кода [color retain] он автоматически высвобождается, и это произойдет случайным образом.

Вам не понадобится [color retain], если вы сделали что-то вроде color = [[UIColor alloc] initWithCGColor:[circleColor CGColor]]; или что-то подобноеимел иници в создании.

...