菜鸟教程小白 发表于 2022-12-11 18:33:55

ios - NSUndoManager removeAllActionsWithTarget 崩溃


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

<p>也就是说,当一个对象只被 NSUndoManager 释放时(因为它超出了撤消的级别),并且根据 <a href="https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/UndoArchitecture/Articles/CleaningUndoStack.html" rel="noreferrer noopener nofollow">docs</a>调用 <code>removeAllActionsWithTarget:self</code>,我得到一个 EXC_BAD_ACCESS。</p>

<pre><code>// 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 = ;
    object.undoManager = self.undoManager;
    // according to docs, object will be retained by NSUndoManager here
    // but target will not (which should be okay)
    ;
}

- (void)viewDidLoad
{
    ;

    self.undoManager = ;
    self.undoManager.levelsOfUndo = 3;
}
</code></pre>

<p>和</p>

<pre><code>// CoolObject.m
@implementation CoolObject

- (void)dealloc
{
    ;
}

@end
</code></pre>

<p>在第四次点击按钮后 (<code>levelsOfUndo</code> + 1),它会崩溃。
如果我用 <a href="https://github.com/seanm/GCUndoManager" rel="noreferrer noopener nofollow">GCUndoManager</a> 交换 NSUndoManager ,没有崩溃。
在 iOS 10.2 sim 和设备中测试。</p>

<p>感谢您的任何想法!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您可能会遇到此错误,因为 <code>self.undoManager</code> 在您使用它的时候没有保留。当对象已经被释放并且你尝试访问它时,你会得到错误的访问异常。</p>

<p>尝试从这里更改您的代码:</p>

<pre><code>CoolObject *object = ;
</code></pre>

<p>到这里:</p>

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

<p>希望这会有所帮助。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - NSUndoManager removeAllActionsWithTarget 崩溃,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/41602669/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/41602669/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - NSUndoManager removeAllActionsWithTarget 崩溃