gpt4 book ai didi

iphone - 无法识别的选择器发送到实例

转载 作者:行者123 更新时间:2023-12-03 18:46:00 24 4
gpt4 key购买 nike

我收到以下错误消息,我无法理解为什么会发生这种情况,因为我没有使用任何 UIImageView。有时我会遇到同样的错误,但它是 CALayer?!?

还值得一提的是,我有 2 个 Nib 和 2 个 Controller 以及此代码所在的基本 Controller 。

编辑:

这是我的项目的结构

MainViewController 及其 Nib - Nib 中的 HomeViewController

MainViewController-Landscape 及其 Nib - HomeViewController- Nib 景观

HomeViewControllerBase - 无 Nib - 存在所有导出和项目配置代码的基类。- socket 由以下两个子类(class)使用。- socket 链接到每个主 Nib 中的控件。

HomeViewController- 继承自HomeViewControllerBase

HomeViewController-风景- 继承自HomeViewControllerBase

所以发生的事情是子类试图释放其基类(其中包含所有 socket )。我这样设计是为了避免在不同方向的 View Controller 中重复代码。

@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() 打印输出添加到 View Controller 的 -dealloc 方法,并确保在点击按钮之前它不会被触发。

实际上,在 configureBestSellItems 的开头再添加一个 NSLog - NSLog(@"I am %x", self); (是的,%x,而不是 % @)。这将打印出您的 View Controller 的地址 - 将其与崩溃对象的地址进行比较(如“无法识别的选择器发送到实例0x681c2b0” - 看看它是否打印“我最初是 0x681c2b0”)

关于iphone - 无法识别的选择器发送到实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5637203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com