2013-04-20 51 views
0

当我尝试更改按钮myButton.titleLabel.textColor中的文本颜色时,我的应用程序崩溃。设置按钮的tltleColor

如果我这样做,应用程序不会崩溃,但文本的颜色保持在blackColor

[myButton setTitleColor:[UIColor colorWithRed:0.41 green:0.107 blue:0.252 alpha:1.0] forState:UIControlStateNormal]; 

如果我这样做,其他方式的应用程序崩溃:

.M:

-(IBAction)buttonTapped:(id)sender { 

    [myButton setTitleColor:myColor forState:UIControlStateNormal]; 

} 

[...] 

-(void) viewDidLoad { 

    myColor = [UIColor colorWithRed:0.41 green:0.107 blue:0.252 alpha:1.0]; 

} 

.H:

UIColor *myColor; 

调试器输出:

2013-04-20 18:23:45.625 myApp[6291:c07] -[NSShadow set]: unrecognized selector sent to instance 0x753bfd0 
2013-04-20 18:23:45.627 myApp[6291:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSShadow set]: unrecognized selector sent to instance 0x753bfd0' 
*** First throw call stack: 
(0x15bb012 0x12c8e7e 0x16464bd 0x15aabbc 0x15aa94e 0x369c87 0x369f76 0x368cd9 0x36b098 0x25ce6e 0x126a3f 0x12652c 0x1269ba 0x1262b6 0x126994 0x11b0e2 0x11b15c 0x990bc 0x9a227 0x9a8e2 0x1583afe 0x1583a3d 0x15617c2 0x1560f44 0x1560e1b 0x261c7e3 0x261c668 0x20cffc 0x21c2 0x20f5) 
libc++abi.dylib: terminate called throwing an exception 
(lldb) 

我该如何解决这个问题?我想用第二种方法(如果可能的话)。

+1

此问题不在发布的代码中。代码中的其他任何地方都必须存在问题。如果您可以添加崩溃日志,这也会非常有帮助。 – miho 2013-04-20 16:21:05

+1

@miho是的。如果不使用ARC,则在调用'buttonTapped:'之前,颜色已经释放(由于被自动释放)。 – omz 2013-04-20 16:29:34

回答

2

您使用colorWithRed:green:blue:alpha:创建的颜色对象自动释放,所以在时间buttonTapped:被调用时,对象已经被释放,所以你有一个指向垃圾数据(悬空指针)的指针。

您可以切换到使用ARC(自动引用计数),和/或为myColor创建保留属性。这看起来像这样在你的头:

@property (nonatomic, retain) UIColor *myColor; 

然后,而不是实例变量直接设置,用途:

self.myColor = [UIColor colorWithRed:0.41 green:0.107 blue:0.252 alpha:1.0]; 

viewDidLoad。如果您不使用ARC,请不要忘记发布颜色dealloc

- (void)dealloc 
{ 
    [_myColor release]; 
    [super dealloc]; 
} 
+0

非常感谢!这正是问题所在! – yeker3 2013-04-20 16:36:33