gpt4 book ai didi

ios - Objective-C:为什么在使用参数调用 objc_msgSend 时会出现 EXC_BAD_ACCESS 异常?

转载 作者:行者123 更新时间:2023-11-28 19:49:41 24 4
gpt4 key购买 nike

我在 Sprite Kit/iOS 7.0 中处理我自己的 Button 类时遇到了一些问题。一旦我尝试使用“objc_msgSend”回调方法,我就会收到以下错误:

Thread 1: EXC_BAD_ACCESS (code=1, address=0x8)

这是我的 Button 类,其中“标识符”返回给调用者:

// Header File *.h
@property (nonatomic, readwrite, strong) NSString* identifier;
@property (nonatomic, readonly, weak) id targetTouchUpInside;
@property (nonatomic, readonly) SEL actionTouchUpInside;

// Implementation File *.m
// ... this code is in the initializer method
NSMutableString *identifier = [[NSMutableString alloc]init];
[identifier appendFormat:@"%d:%d", menuId, itemId];
[self setIdentifier:[identifier copy]];

// ... this code is called to inform the observer about an event
objc_msgSend(_targetTouchUpInside, _actionTouchUpInside, _identifier);

这是 Button 在检测到触摸时立即调用的回调方法。这是抛出 EXC_BAD_ACCESS 异常的点。 “标识符”为“nil”,但仅在 iPad Air 上有效,有趣的是它在 iPhone 4S 上运行良好。

// ... this is the callback method in the object that instantiates the button object
- (void)itemTouchInside:(NSString*)identifier {
NSLog(@"ID CALLED: %@", identifier);
}

我观察到当我调用“objc_msgSend”时它也适用于 iPad ...

  • 没有“_identifier”参数和/或
  • 使用“int”而不是“NSString*”作为参数
  • 使用预定义的不可变 NSString *identifier = @"fixed-string";

但我需要动态定义 _identifier,如上面的代码片段所示。

知道为什么这适用于 iPhone 而不是 iPad 吗?

最佳答案

我建议您将 objc_msgSend 的使用替换为以下内容:

[self.targetTouchUpInside performSelector:self.actionTouchUpInside withObject:self.identifier];

还要注意属性的使用。你有属性(property),使用它们。

正如其他人所提到的,最好使用copy 而不是strong 来定义identifier 属性。消除了一些可能(且难以发现)的错误。

关于ios - Objective-C:为什么在使用参数调用 objc_msgSend 时会出现 EXC_BAD_ACCESS 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29949482/

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