[英]unrecognized selector sent to instance
我收到以下错误消息,我无法理解为什么它发生,因为我没有使用任何UIImageView。 有时我得到同样的错误,但它是一个CALayer?!?
值得一提的是,我有2个nib和2个控制器以及这个代码所在的基本控制器。
编辑:
这是我项目的结构
MainViewController及其笔尖 - nib中的HomeViewController
MainViewController-Landscape及其笔尖 - HomeViewController-Landscape in nib
HomeViewControllerBase - no nib - 存在所有出口和项目配置代码的基类。 - 以下两个子课程都使用奥特莱斯。 - 奥特莱斯与每个主要笔尖中的控件相关联。
HomeViewController - 从HomeViewControllerBase继承
HomeViewController-Landscape - 从HomeViewControllerBase继承
所以发生的事情是,子类正在尝试释放其基类(其中包含所有出口)。 我这样设计它是为了避免在不同的方向视图控制器中重复代码。
@implementation MainViewController
- (void)orientationChanged:(NSNotification *)notification
{
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
if (UIDeviceOrientationIsLandscape(deviceOrientation) && !isShowingLandscapeView)
{
[self presentModalViewController:self.landscapeViewController
animated:YES];
isShowingLandscapeView = YES;
}
else if (UIDeviceOrientationIsPortrait(deviceOrientation) && isShowingLandscapeView)
{
[self dismissModalViewControllerAnimated:YES];
isShowingLandscapeView = NO;
}
}
- (id)init
{
self = [super initWithNibName:@"MainViewController" bundle:nil];
if (self)
{
isShowingLandscapeView = NO;
self.landscapeViewController = [[[MainViewController_Landscape alloc]
initWithNibName:@"MainViewController-Landscape" bundle:nil] autorelease];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
}
return self;
}
@end
@implementation HomeViewControllerBase
- (void)bestSellItemTapped:(id)sender
{
NSLog(@"best sell item tapped");
}
- (void)configureBestSellItems
{
[self startRetrievingRegions];
// load all the images from our bundle and add them to the scroll view
// NSUInteger i;
for (int i = 0; i <= 150; i++)
{
UILabel *itemTitle = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 50)];
itemTitle.text = @"Majorca";
UILabel *itemPrice = [[UILabel alloc]initWithFrame:CGRectMake(0, 50, 100, 50)];
itemPrice.text = @"£249";
NSString *imageName = @"tempImage.jpg";
UIImage *image = [UIImage imageNamed:imageName];
UIButton *mainButton = [[[UIButton alloc]init] autorelease];
[mainButton addTarget:self action:@selector(bestSellItemTapped:) forControlEvents:UIControlEventTouchUpInside];
[mainButton setBackgroundImage:image forState:UIControlStateNormal];
// setup each frame to a default height and width, it will be properly placed when we call "updateScrollList"
CGRect rect = mainButton.frame;
rect.size.height = kScrollObjHeight;
rect.size.width = kScrollObjWidth;
mainButton.frame = rect;
mainButton.tag = i;
[mainButton addSubview:itemTitle]; [itemTitle release];
[mainButton addSubview:itemPrice]; [itemPrice release];
[self.bestSellScrollView addSubview:mainButton];
}
[self layoutScrollImages]; // now place the photos in serial layout within the scrollview
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
[super viewDidLoad];
[self configureBestSellItems];
}
- (void)layoutScrollImages
{
UIButton *view = nil;
NSArray *subviews = [self.bestSellScrollView subviews];
// reposition all image subviews in a horizontal serial fashion
CGFloat curXLoc = 0;
for (view in subviews)
{
if ([view isKindOfClass:[UIButton class]] && view.tag > 0)
{
CGRect frame = view.frame;
frame.origin = CGPointMake(curXLoc, 0);
view.frame = frame;
curXLoc += (kScrollObjWidth + kScrollObjPadding);
}
}
// set the content size so it can be scrollable
[self.bestSellScrollView setContentSize:CGSizeMake((150 * kScrollObjWidth),
[self.bestSellScrollView bounds].size.height)];
}
@end
@interface HomeViewController : HomeViewControllerBase
@end
@interface HomeViewController_Landscape : HomeViewControllerBase
@end
@implementation HomeViewController
- (void)dealloc
{
[super dealloc]; //When I remove this it works
}
@end
@implementation HomeViewController_Landscape
- (void)dealloc
{
[super dealloc]; //When I remove this it works
}
@end
-[UIImageView bestSellItemTapped:]: unrecognized selector sent to instance 0x681c2b0 2011-04-12 15:45:26.665 [21532:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIImageView bestSellItemTapped:]: unrecognized selector sent to instance 0x681c2b0'
*** Call stack at first throw: ( 0 CoreFoundation 0x00dc85a9 __exceptionPreprocess + 185 1 libobjc.A.dylib 0x00f1c313 objc_exception_throw + 44 2 CoreFoundation 0x00dca0bb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 3 CoreFoundation 0x00d39966 ___forwarding___ + 966 4 CoreFoundation 0x00d39522 _CF_forwarding_prep_0 + 50 5 UIKit 0x0001a4fd -[UIApplication sendAction:to:from:forEvent:] + 119 6 UIKit 0x000aa799 -[UIControl sendAction:to:forEvent:] + 67 7 UIKit 0x000acc2b -[UIControl(Internal)
_sendActionsForEvents:withEvent:] + 527 8 UIKit 0x000ab7d8 -[UIControl touchesEnded:withEvent:] + 458 9 UIKit 0x002ad4de
_UIGestureRecognizerSortAndSendDelayedTouches
+ 3609 10 UIKit 0x002adc53
_UIGestureRecognizerUpdateObserver + 927 11 CoreFoundation 0x00da989b
__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
+ 27 12 CoreFoundation 0x00d3e6e7 __CFRunLoopDoObservers + 295 13 CoreFoundation 0x00d071d7 __CFRunLoopRun + 1575 14 CoreFoundation 0x00d06840 CFRunLoopRunSpecific + 208 15 CoreFoundation 0x00d06761 CFRunLoopRunInMode + 97 16 GraphicsServices 0x010001c4 GSEventRunModal + 217 17 GraphicsServices 0x01000289 GSEventRun + 115 18 UIKit 0x00028c93 UIApplicationMain + 1160 19 0x000027a9 main + 121 20
0x00002725 start + 53 ) terminate called after throwing an instance of 'NSException'
当点击按钮时,这个代码来自哪个ViewController
仍然存在? 像这样的错误(不相关的对象 - 在这种情况下是UIImageView
)通常意味着你有一个指向内存的某个区域的指针已经被释放并重用于其他东西(在这种情况下是UIImageView
)。
将NSLog()
打印输出添加到视图控制器的-dealloc方法,并确保在点击按钮之前不会触发它。
实际上,在configureBestSellItems
的开头添加一个NSLog - NSLog(@"I am %x", self);
(是的,%x,而不是%@)。 这将打印出view controller
的地址 - 将其与崩溃对象的地址进行比较(如“无法识别的选择器发送到实例0x681c2b0 ” - 看看它是否最初打印“我是0x681c2b0”)
如果您正在使用InterfaceBuilder并在控制器头文件中对 IBActions /方法执行一些连接/链接GUI元素, 请右键单击或“cntrl +单击”导致错误连接/链接到仍然存在的方法的GUI元素只要。
在将`dismissViewControllerAnimated:completion`发送到UIViewController后,请参阅`发送到实例<OBJ_ADR>`的`unrecognized selector
当你分配你的UIButton
,你把它标记为autorelease
,这可能是崩溃的原因,因为有可能系统声称mainButton
,
UIButton *mainButton = [[[UIButton alloc]init] autorelease];
检查删除autorelease
,如果有效,请将UIButton
作为类变量,或使用UIButton's
buttonWithtype
从系统获取按钮。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.