2013-04-20 47 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