gpt4 book ai didi

ios - NSUndoManager removeAllActionsWithTarget 崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:54:29 27 4
gpt4 key购买 nike

我有一些简短的 iOS Objective-C 示例代码(从一个较大的项目中简化而来)导致 NSUndoManager 崩溃,我无法解释。

即,当一个对象仅由 NSUndoManager 持有时 deallocs(因为它超出了撤消级别),并且根据 docs调用 removeAllActionsWithTarget:self,我得到一个 EXC_BAD_ACCESS。

// SimpleViewController.m
@interface ViewController ()
@property (nonatomic, strong) NSUndoManager *undoManager;
@end

@implementation ViewController

@synthesize undoManager;

// called from a simple button
- (IBAction)doItTapped:(id)sender
{
CoolObject *object = [CoolObject new];
object.undoManager = self.undoManager;
// according to docs, object will be retained by NSUndoManager here
// but target will not (which should be okay)
[self.undoManager registerUndoWithTarget:self selector:@selector(notCool:) object:object];
}

- (void)viewDidLoad
{
[super viewDidLoad];

self.undoManager = [NSUndoManager new];
self.undoManager.levelsOfUndo = 3;
}

// CoolObject.m
@implementation CoolObject

- (void)dealloc
{
[self.undoManager removeAllActionsWithTarget:self];
}

@end

在第 4 次点击按钮 (levelsOfUndo + 1) 后,它崩溃了。如果我将 NSUndoManager 与 GCUndoManager 交换,没有崩溃。在 iOS 10.2 sim 和设备中测试。

感谢任何想法!

最佳答案

您可能会遇到此错误,因为 self.undoManager 在您使用它的那一刻没有保留。当对象已经被释放并且您尝试访问它时,您将得到错误的访问异常。

试着改变你的代码:

CoolObject *object = [CoolObject new];

为此:

@interface ViewController (){
CoolObject *object;
}
@property (nonatomic, strong) NSUndoManager *undoManager;
@end
@implementation ViewController
- (IBAction)doItTapped:(id)sender
{
object = [CoolObject new];
object.undoManager = self.undoManager;
// according to docs, object will be retained by NSUndoManager here
// but target will not (which should be okay)
[self.undoManager registerUndoWithTarget:self selector:@selector(notCool:) object:object];
}
@end

希望这会有所帮助。

关于ios - NSUndoManager removeAllActionsWithTarget 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41602669/

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