Iphone 在for循环中使用id而不是自定义类

Iphone 在for循环中使用id而不是自定义类,iphone,ios,ios5,ios6,uikit,Iphone,Ios,Ios5,Ios6,Uikit,我正在为iOS>5.0开发一个应用程序,并使用Xcode 4.6.2&我有一个UIView,其中包含一系列UIKit元素 举个例子,我有一个名为RadioButton的自定义类,它的基类是UIButton,正如您所想象的那样。我还有一个名为CRTLabel的类,它是UILabel的子类 当我在控制台中po[view subview]时,我得到了 $0 = 0x0754c4d0 <__NSArrayM 0x754c4d0>( <CRTLabel: 0x857f120; baseC

我正在为iOS>5.0开发一个应用程序,并使用Xcode 4.6.2&我有一个
UIView
,其中包含一系列
UIKit
元素

举个例子,我有一个名为
RadioButton
的自定义类,它的基类是
UIButton
,正如您所想象的那样。我还有一个名为
CRTLabel
的类,它是
UILabel
的子类

当我在控制台中
po[view subview]
时,我得到了

$0 = 0x0754c4d0 <__NSArrayM 0x754c4d0>(
<CRTLabel: 0x857f120; baseClass = UILabel; frame = (10 10; 360 35); text = '2- Sizce evet mi hayır mı...'; clipsToBounds = YES; userInteractionEnabled = NO; tag = 1; layer = <CALayer: 0x857f1b0>>,
<RadioButton: 0x857f520; baseClass = UIButton; frame = (20 65; 44 44); opaque = NO; layer = <CALayer: 0x857f5e0>>,
<CRTLabel: 0x857f800; baseClass = UILabel; frame = (84 65; 600 44); text = 'Evet'; clipsToBounds = YES; userInteractionEnabled = NO; tag = 122; layer = <CALayer: 0x857f740>>,
<RadioButton: 0x857fb50; baseClass = UIButton; frame = (20 139; 44 44); opaque = NO; tag = 1; layer = <CALayer: 0x857fa60>>,
<CRTLabel: 0x857fd60; baseClass = UILabel; frame = (84 139; 600 44); text = 'Hayır'; clipsToBounds = YES; userInteractionEnabled = NO; tag = 122; layer = <CALayer: 0x857fc60>>
)
我的应用程序崩溃,说没有选定的属性。我使用了
isKindOfClass
方法来测试radioButton是否是
radioButton
。因此,我发现它迭代了所有的子视图,如果它不是
RadioButton
。为了进一步解释,即使当前子视图是
CRTLabel
,它也会跳过下一行,
CRTLabel
没有名为
selected
的属性,因此它会崩溃

所以,我的期望是消除所有不是
RadioButton
的类,它只在
RadioButton
s上迭代


所以我的问题是,
在Objective-c的foreach循环中指定自定义类有什么好处?我总是可以在循环中使用
id
,而不是检查id是否类似于
RadioButton

测试
是否属于类

for(id radioButton in view.subviews)
{
    if(radioButton isKindOfClass: RADIOBUTTON)
    { 

     if((RADIOBUTTON *)radioButton.selected == YES && (RADIOBUTTON *)radioButton.tag == 0)
     // Does something
     else if((RADIOBUTTON *)radioButton.selected == YES && (RADIOBUTTON *)radioButton.tag == 1)
     // Does something
    }
}

view.subview
将返回数组子视图。它将包括您的单选按钮和标签,如
视图
的子视图

  for(RadioButton *radioButton in view.subviews) //  logically wrong since subView can be anything button,label...

  for(UIView *subView in view.subviews)
  { 
     // Iterate through all subViews

     if([subView isKindOfClass:[RadioButton class]])
      {
        //safe no crash
      }
  }

您不能仅迭代特定视图(radioButton)。正如您所说,您可以遍历所有视图,并使用
isKindOfClass
来标识特定的子视图。否则,您应该使用视图的标记属性来删除迭代

我已经这样做了,它现在正在工作,我只是想知道使用自定义类而不是使用id的优点。哦,使用您所做的没有优点,而是缺点,不是很健壮不,但我需要通过RadioButton进行迭代,我不需要遍历所有UIViews,这是不可能的。您不能遍历特定的子视图。迭代所有子视图不会产生任何问题。。它的快速枚举。忽略它:)
  for(RadioButton *radioButton in view.subviews) //  logically wrong since subView can be anything button,label...

  for(UIView *subView in view.subviews)
  { 
     // Iterate through all subViews

     if([subView isKindOfClass:[RadioButton class]])
      {
        //safe no crash
      }
  }