【问题标题】:Accessing property of returned object causes EXC_BAD_ACCESS访问返回对象的属性会导致 EXC_BAD_ACCESS
【发布时间】:2011-09-27 23:27:13
【问题描述】:

我定义了一个类,其中前两个属性可以毫无问题地访问。只有UIColor* 是个问题。我想有些东西没有被正确地分配、初始化、保留或释放,并且一直在改变各种事情而没有成功。任何帮助都会很重要。

// PieceScore.h

@interface PieceScore : NSObject {
    int     pieceCount;
    BOOL    greatMatch;
    UIColor *colorMatched;
}

@property (nonatomic) int pieceCount;
@property (nonatomic) BOOL greatMatch;
@property (nonatomic, retain) UIColor *colorMatched;

-(id) initWithPieceCount:(int)pC withGreatMatch:(BOOL)gM withColorMatched:(UIColor*)cM;

@end


// PieceScore.m

@implementation PieceScore

@synthesize pieceCount, greatMatch, colorMatched;

-(id) init {
    return [self initWithPieceCount:0 withGreatMatch:NO withColorMatched:[UIColor clearColor]];
}

-(id) initWithPieceCount:(int)pC withGreatMatch:(BOOL)gM withColorMatched:(UIColor*)cM {
    self = [super init];
    if (self) {
        pieceCount = pC;
        greatMatch = gM;
        colorMatched = cM;
    }
    return self;
}

@end

由另一个类初始化并返回如下:

PieceScore* pieceScore = [[[PieceScore alloc] initWithPieceCount:piecesRemoved withGreatMatch:greatMatch withColorMatched:pieceColor] autorelease];
return pieceScore;

注意:(pieceColorUIColor*

然后,UIColor* 被用在另一个类的方法中:

- (void) labelRender:(UILabel*)label withColor:(UIColor *)color {
    // ...

    label.textColor = color; // Thread 1: Program received signal: "EXC_BAD_ACCESS".

    // ...
}

在调试视图中,我可以看到 color 实际上是作为 UIColor* 传递的,但是在分配给标签的 textColor 属性时出错。

【问题讨论】:

  • 当你写 PieceScore*pieceScore = [[[PieceScore alloc] initWithPieceCount:piecesRemoved withGreatMatch:greatMatch withColorMatched:pieceColor] autorelease];返回pieceScore;您从未保留/自动释放颜色对象本身,您只会自动释放 PieceScore。可能这就是它丢失的原因......
  • @Joe :实际上,类似于“label.textColor = [UIColor greenColor];”仍然有效,但以其他方式分配它不起作用。我已经尝试了这里的所有建议,但仍然总是以 SIGABERT 或 EXC_BAD_ACCESS 结束。

标签: iphone objective-c cocoa-touch memory-management


【解决方案1】:

您正在将 ivar 设置为自动释放的变量。确保您使用该属性,以便正确保留它。

colorMatched = cM; 更改为self.colorMatched = cM;

【讨论】:

  • 这个逻辑是有道理的。但是,这样做会导致 SIGABRT 在 main...“-[NSCFString set]: unrecognized selector sent to instance 0x143a80”和“*** Terminating app due to unaught exception 'NSInvalidArgumentException', reason: '-[NSCFString set]:无法识别的选择器发送到实例 0x143a80'"
【解决方案2】:

initWithPieceCount:piecesRemoved:withGreatMatch:withColorMatched 中的 ivars 需要确保它们保留任何可能作为自动释放提供的值。你不应该在你的 init 方法中使用属性,

See here for some discussion

对传递的对象进行保留。

即colormatched = [cM 保留];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多