HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了xcode – 使用performSelector执行的方法中的objc_retain中的崩溃大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这个奇怪的崩溃与ARC自动插入objc_retains在我的@L_618_2@.

我有以下两个类:

@interface MenuItem : NSObject
@property (weak,nonatomiC) id target;
@property (unsafe_unretained,nonatomiC) SEL action;
@property (strong,nonatomiC) id object;
- (instanCETypE)initWIthTarget:(id)target action:(SEL)action withObject:(id)object;
- (void)performAction;
@end

@implementation MenuItem 
- (void)performAction
{
    if (self.target && self.action)
    {
      if (self.object)
      {
        [self.target performSELEctor:self.action withObject:self.object];
      }
      else
      {
        [self.target performSELEctor:self.action];
      }
    }
}
@end

@interface Widget : NSObject
- (void)someMethod:(id)sender;
@end

在某些时候,我实例化@L_306_4@menuItem:

@H_347_4@menuItem *item = [MenuItem alloc] initWithTarget:widget action:@SELEctor(someMethod:) object:nil];

然后在其他地方,我在菜单项上调用performAction:

[item performAction];

在执行某些方法我遇到崩溃:

@implementation Widget
- (void)someMethod:(id)sender
{
  // EXEC_BAD_ACCESS crash in objc_retain
}
@end

为什么会这样?

解决方法

崩溃的原因是因为我使用了错误的performSELEctor.

NSObject定义了多个版本的performSELEctor.我正在援引的是:

- (id)performSELEctor:(SEL)aSELEctor;

但是,我正在调用方法使用了一个id参数.例如:

- (void)someMethod:(id)sender;

现在,ARC是一个很好的安全内存管理系统,它正在尝试确保在执行方法期间适当地保留参数.所以即使我的someMethod:是空的ARC生产的@L_618_2@看起来像这样

- (void)someMethod:(id)sender 
{
    objc_retain(sender);
    objc_release(sender);
}

然而,这个问题是我正在调用performSELEctor:而不是为sender参数提供一个值.所以发件人指着堆栈上的随机垃圾.因此,当调用objc_retain()时,应用程序崩溃.

如果我改变:

@H_347_4@menuItem *item = [[MenuItem alloc] initWithTarget:widget action:@SELEctor(someMethod:) object:nil];

@H_347_4@menuItem *item = [[MenuItem alloc] initWithTarget:widget action:@SELEctor(someMethod) object:nil];

- (void)someMethod:(id)sender;

- (void)someMethod;

然后崩溃消失了.

同样,我也可以改变

[self.target performSELEctor:self.action];

[self.target performSELEctor:self.action withObject:nil];

如果我想遵循采用单个参数的“标准”形式的目标动作方法. performSELEctor的第二种形式的好处是,如果我正在调用一个不接受参数的方法,它仍然可以正常工作.

大佬总结

以上是大佬教程为你收集整理的xcode – 使用performSelector执行的方法中的objc_retain中的崩溃全部内容,希望文章能够帮你解决xcode – 使用performSelector执行的方法中的objc_retain中的崩溃所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。