NSTextStorage 对大小和更新频率的限制

2023-12-11

我正在尝试创建一个类似终端的应用程序,可以在应用程序运行时显示日志。

当前的实现使用 NSScrollView -> NSTextView。但是,我注意到 NSTextView 的大小对于我的程序来说不够大,并且我无法经常更新 UI。

假设我们有如下所示的示例代码(其他所有内容与全新的 Xcode 应用程序项目相同)。

该程序继续每 0.1 秒向 UI 打印一些垃圾文本并更新视图。我发现程序每次运行4分钟左右就崩溃了。另外我必须在每个垃圾文本之间添加 0.1 秒的延迟。如果我没有设置任何延迟时间,程序就会立即崩溃。我想找到解决这个问题的方法。

我不确定 NSTextView 是否仍然是我的应用程序的最佳选择。如果没有,任何人都可以为我指出正确的方向,即可以像终端应用程序一样运行的视图或视图集合。

提前致谢。

#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize queue = _queue;
@synthesize theTextView = _theTextView;

- (void)dealloc
{
    [super dealloc];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application 322, 40, 895, 720
    NSScrollView *scrollview = [[NSScrollView alloc]
                                initWithFrame:[[_window contentView] frame]];
    NSSize contentSize = [scrollview contentSize];

    [scrollview setBorderType:NSNoBorder];
    [scrollview setHasVerticalScroller:YES];
    [scrollview setHasHorizontalScroller:NO];
    [scrollview setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

    _theTextView = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0,
                                                               contentSize.width, contentSize.height)];
    [_theTextView setMinSize:NSMakeSize(0.0, contentSize.height)];
    [_theTextView setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
    [_theTextView setVerticallyResizable:YES];
    [_theTextView setHorizontallyResizable:NO];
    [_theTextView setAutoresizingMask:NSViewWidthSizable];

    [[_theTextView textContainer] setContainerSize:NSMakeSize(contentSize.width, FLT_MAX)];
    [[_theTextView textContainer] setWidthTracksTextView:YES];

    [scrollview setDocumentView:_theTextView];
    [_window setContentView:scrollview];
    [_window makeKeyAndOrderFront:nil];
    [_window makeFirstResponder:_theTextView];

    [[_theTextView enclosingScrollView] setHasHorizontalScroller:YES];
    [_theTextView setHorizontallyResizable:YES];
    [_theTextView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
    [[_theTextView textContainer] setContainerSize:NSMakeSize(FLT_MAX, FLT_MAX)];
    [[_theTextView textContainer] setWidthTracksTextView:NO];
    _queue = dispatch_queue_create("com.example.MyQueue", NULL);

    [self start];
}

- (void) start {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
        [self feed];
    });

}
- (void) feed {
    while (1) {
        dispatch_async(_queue, ^(void){
            NSString * displaytext = (NSString *) CFSTR("Testing Line - asdfasdfklqjwer;opfjiasdlk;fjasd\n");

            NSAttributedString *string = [[NSAttributedString alloc] initWithString:displaytext];
            NSLog(@"Output is %@", string);

            //        [[_theTextView textStorage] appendAttributedString:string];

            [[_theTextView textStorage] beginEditing];
            [[_theTextView textStorage] appendAttributedString:string];
            [[_theTextView textStorage] endEditing];
            [_theTextView scrollRangeToVisible:NSMakeRange([[_theTextView string] length], 0)];

            [string release];

        });
        usleep(100000);
    }

}

@end

一般来说,AppKit 不是线程安全的。您正在从后台线程更改文本存储并滚动文本视图 - 因此它工作不一致或崩溃也就不足为奇了。

您所证明的只是您错误地使用了 AppKit,而不是 NSTextView 对于您的目的而言存在致命缺陷。 (它可能仍然存在致命缺陷,但这不是一个好的理由。)

要正确进行此测试:

- (void)start
{
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(feedOne:) userInfo:nil repeats:YES];
}

- (void)feedOne:(NSTimer*)timer
{
    NSString* displaytext = @"Testing Line - asdfasdfklqjwer;opfjiasdlk;fjasd\n";    
    NSAttributedString* string = [[NSAttributedString alloc] initWithString:displaytext];

    [[_theTextView textStorage] beginEditing];
    [[_theTextView textStorage] appendAttributedString:string];
    [[_theTextView textStorage] endEditing];
    [_theTextView scrollRangeToVisible:NSMakeRange([[_theTextView string] length], 0)];

    [string release];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSTextStorage 对大小和更新频率的限制 的相关文章

  • 如何在 UIView 中获取父导航控制器

    我创建了一个UITabBarController在我的应用程序委托中 其中每个选项卡栏项目都有不同的UINavigationController加载自定义的UIViewController带NIB 使用 pushViewController
  • NSTextview:如何获取插入点的字形矩形?自定义文本视图?

    我似乎找不到任何有关如何获取插入点的矩形的文档 我试图在文本插入点 插入点正下方显示一个视图 如自动完成 我正在考虑制作一个自定义文本视图 但如果我可以避免它 那对我的情况来说将是理想的 谢谢 NSRect rectForActiveRan
  • 如何在 iOS 中以编程方式在 UITableViewCells 中添加图像

    我需要添加不同的图像UITableViewCells以编程方式 我怎样才能做到这一点 我正在尝试一些代码 但图像不显示在UITableViewCells 这是我下面的代码 void viewDidLoad arrImages NSMutab
  • 使用 Bash 按进程名称检查 Mac 进程是否正在运行

    如何使用 Bash 脚本中的进程名称检查 Mac OS X 上的进程是否正在运行 我正在尝试编写一个 Bash 脚本 如果进程已停止 它将重新启动进程 但如果进程仍在运行 则不执行任何操作 解析这个 ps aux grep v grep g
  • python 语言环境奇怪的错误。这究竟是怎么回事?

    所以今天我升级到了 bazaar 2 0 2 我开始收到这条消息 顺便说一句 我在雪豹上 bzr warning unknown locale UTF 8 Could not determine what text encoding to
  • FlurrySDK 与 cocoapods

    我正在尝试使用 Cocoapods 将 FlurrySDK 框架集成到我的应用程序中 正如我已经使用很多框架所做的那样 但由于某种原因 xcode 不断抛出此编译错误 Undefined symbols for architecture a
  • 如何使用 UIScrollView?

    我该如何使用UIScrollView 请给我一个带有一张滚动图像的简单示例 这将使您深入了解UIScrollView控制 学习 UIScrollView 的基础知识 https stackoverflow com questions 159
  • 类型铸造自我

    以下自我转换对 ClassA 有何作用 这种种姓可以让你进入ClassA吗 A h类 interface ClassA NSObject NSUInteger someNumber ClassB classB property nonato
  • 不确定如何在使用故事板时正确子类化 UIApplication

    我想在 X 次用户不活动 没有触发触摸事件 后返回故事板的初始视图控制器 经过一些研究 我发现检测不活动的最常见方法是触发 NSTimer 并在事件触发时重置间隔 为了检测触发的事件 我们在 UIApplication 的子类中重写 UIA
  • 网守检疫问题与证书

    我们的应用程序已经过代码签名 我们的 Apple 证书是最新的 我们的应用程序的早期版本运行得很好 然而 当用户下载 DMG 时 在某些 Mac 上该应用程序会被隔离 但对于大多数用户而言 情况并非如此 因此 一些用户可以打开该应用程序 而
  • NSString 到 TimeInterval

    我有一个 NSString 的格式00 00 00 00最初获得自 dateFormatter setDateFormat HH mm ss SS 我如何获取该字符串并将其转换为 TimeInterval 如果您 100 绝对肯定这种格式永
  • Firebase 查询 - 查找包含字符串的子项

    我在使用 Firebase 查询时遇到了一些问题 我想查询对象 其中对象子值包含特定字符串 到目前为止 我有一些看起来像这样的东西 Firebase ref Firebase alloc initWithUrl https dinosaur
  • UnicodeDecodeError:“utf-8”编解码器无法解码位置 14 中的字节 0xb9:起始字节无效

    我正在使用 Django REST 进行文件上传测试 Python3 6 2Django1 11djangorest框架 3 6 4Excel OSX 15 38 170902 操作系统 10 12 6 过去使用普通照片文件可以成功完成此操
  • NSEvent addGlobalMonitorForEventsMatchingMask:热键拦截

    I wanna intercept hotkeys that begin with Control Shift and ends with a character mandatory I have the following code NS
  • Mac OSX 上使用 Java 7 的透明 JFrame/JWindow

    我们有一个屏幕共享小程序 它打开 Swing JFrame 并使用 Robot 类捕获空框架后面的屏幕 用户可以单击框架并与小程序后面的任何内容进行交互 这在 Windows 上运行良好 并且用于 Apple 的 Java 版本 但对于 M
  • “UITableViewCell 附件复选标记”是图像吗?

    我需要定义一个自定义UITableViewCell哪里的UITableViewCellAccessoryCheckmark位于 a 的左侧UILabel 我应该将其定义为图像还是有更聪明的方法 非常感谢 卡洛斯 这只是一个关于苹果文档 ht
  • 安塞布尔 + 10.11.6

    我在 非常 干净地安装 10 11 6 时遇到了 Ansible 的奇怪问题 我已经安装了brew zsh oh my zsh Lil snitch 和1password 实际上没有安装其他任何东西 我安装了ansible brew ins
  • Mac 上的 JavaFX WebView 字体问题

    有些网站显示乱码而不是正确的文本 它只发生在 Mac 上 For example with GMapsFX 可能与 OS X 10 11 或 10 12 有关 我用Java 1 8 0 121测试了它 此问题有任何修复或解决方法吗 就我而言
  • 不同形状的图像拼贴

    我对照片编辑应用程序开发完全陌生 我如何开发这样的网格样式 以便我可以添加从相机胶卷中选取的多个图像来创建拼贴画 我浏览了下面的链接 但没有找到实现这一目标的方法 任何建议或链接都 会有帮助 LINK1 https stackoverflo
  • 我可以混合 UITableViewDelegate 的 didSelectRowAtIndexPath: 吗?

    问题是这样的 我需要能够在具有大量表视图的大型现有应用程序中获取 didSelectRowAtIndexPath 的分析 我的第一个想法是在 didSelectRowAtIndexPath 上进行方法调整 但是我的应用程序崩溃并显示 无法识

随机推荐