2012-01-13 106 views
0

我看到有人通過按鈕的標籤傳遞參數,如下所示。 這怎麼可能工作?這樣做是否安全?通過按鈕的標籤傳遞參數objective-c

NSCustomClass* cls = [[NSCustomClass alloc] init:@"",@"",@""]; 
[button setTag:(int) cls]; 



- (void)OnClick:(id)sender 
{ 
    NSCustomClass* cls = (NSCustomClass*)[sender tag]; 
    // to do something with the "cls". 
    [cls release]; 
} 

事實上,我沒有得到奇怪的結果。

它通過傳遞像'NSString','NSArray'這樣的參數可以正常工作。

你能告訴我爲什麼這是一個壞主意嗎?

回答

1

一般而言,您從不想濫用框架。該標記旨在存儲整數,主要用於通過viewWithTag:來訪問視圖,如果您的視圖是在Interface Builder中構建的,但是引用IBOutlet不合適,這在某些情況下可能很有用。正如其他人所指出的那樣,將指針填入整數可能會產生不可預測的結果。

最重要的是存在內存管理問題。即使指針在劇組中存活,您也不會保留指向的對象。這實際上是一個弱指針,但在運行時沒有任何管理。嘗試使用指針可能會導致令人生畏的EXC_BAD_ACCESS。誰知道ARC可能會怎樣處理這個混亂 - 我會預料會炸燬。

要將數據附加到按鈕(本身聽起來像是一個可能的設計缺陷),您應該通過objc_setAssociatedObject()和朋友來繼承或利用運行時的威力。

2

將自定義類投射到int是一個非常糟糕的主意,你會得到奇怪的結果。

tag是所有UI元素上的整數屬性。它被聲明爲這樣上UIView

@property(nonatomic) NSInteger tag; 

可以任何整數值分配給它,包括任何預定義的常量:

#define Button1Constant 1 
#define PushButtonConstant 2 
// …Code 
[button setTag:PushButtonConstant]; 
// …More code 
if (sender.tag == PushButtonContent) 
    // Handle 
+0

+1將自定義類投射到NSInteger的可怕想法。 – Saphrosit 2012-01-13 03:08:50

+0

詳細說明,這是可行的,因爲NSInteger與任何給定平臺上的C指針大小相同。無論如何,壞主意是因爲如果你釋放對象,按鈕標籤將成爲一個指向無處的指針。 – Costique 2012-01-13 05:28:08

1

一般來說,從指針類型強制轉換爲整數類型通常表明設計缺陷;這樣做的合法理由很少,我強烈建議不要這樣做,特別是在這種情況下。它可能有效,但不能保證能正常工作,因爲tag屬性沒有記錄爲以這種方式使用。您在代碼中放置的更多「黑客」,則難以維護。

不要從你看到的代碼中學習,而應該堅持着名的教程和書籍。

作爲一個附註,在Objective-C中傳統的方法是命名所有以小寫字母開頭的方法,所以方法應該是onClick:而不是OnClick:。此規則的例外是該方法以首字母縮寫詞開頭,例如-[NSString UTF8String]

0

你可以從UIButton子類中自定義一個屬性,而不是使用它的標籤屬性。