我有一个基于Cocoa文档的应用程序(文本编辑器),我希望能够从命令行与它进行交互.
例如,我想将其设置为在命令行上键入git/svn commit消息的编辑器.
假设我使用Foundation创建命令行工具,我的命令行工具与GUI应用程序通信的最佳方法是什么?
显然,我可以使用标准的开放事件让我的应用程序打开一个特定的文件,但我还需要命令行应用程序等待GUI应用程序完成文档(用户关闭编辑器窗口),然后退出(类似于mate -w file.txtTextMate的命令)行工具,或其他各种mac文本编辑器中的等效工具).
TextMate 2 使用套接字文件.这是最好的方法吗?如果可能的话,我想使用更高级别的东西NSDistributedNotificationCenter.
我的代码崩溃了EXC_BAD_ACCESS错误,我不知道如何调试.
这是代码:
NSUInteger lineCount = self.lineBeginnings.count;
NSUInteger lineBeginnings[lineCount];
[self.lineBeginnings getIndexes:lineBeginnings maxCount:lineCount inIndexRange:nil];
Run Code Online (Sandbox Code Playgroud)
它在最后一行崩溃了EXC_BAD_ACCESS (code=2, address=0x...).
注意上面的两行,它能够完美地读取self.lineBeginnings,但在调试器中我得到:
(lldb) p [self lineBeginnings]
error: Trying to put the stack in unreadable memory at: 0x7fff5d15e310.
(lldb) p _lineBeginnings
(NSMutableIndexSet *) $1 = 0x0000610000059b90
(lldb) po _lineBeginnings
[no Objective-C description available]
Run Code Online (Sandbox Code Playgroud)
此外,lineBeginnings在GUI范围浏览器中没有正确显示(所有其他变量都可以)并且尝试"查看lineBeginnings"会给出一个完全空的内存视图.
该lineBeginnings变量存储为一个强大的@财产,它在应用程序委托的init方法创建和应用程序运行时,切勿取出一个可变的指标集.有一个后台操作队列写入它,但它切换到主线程用于所有修改使用dispatch_sync(dispatch_get_main_queue()).
我不确定如何进一步调试?它很难重现,我必须调整窗口大小一分钟(这会导致lineBeginnings变量在后台队列上重新创建,这个过程在给定180MB数据时需要大约5分钟),以便制作这次崩溃发生了.
它看起来像缓冲区溢出或对我来说什么?如何追踪它?
该文件的源代码如下:https://gist.github.com/abhibeckert/7128740(崩溃在第254行).
我正在为我的ObjC类写一个Swift扩展.虽然我的代码编译和运行完美,但我得到了一堆Xcode警告(每个Swift方法一个):
"Method definition for 'foo_method:' not found"
"Method definition for 'bar_method:' not found"
"Method definition for 'baz_method:' not found"
Run Code Online (Sandbox Code Playgroud)
重现Xcode消息很简单.我用四行非样板代码制作了这个演示项目:
Objective-C(NSView的子类)
// Subclass_of_NSView.h
#import <Cocoa/Cocoa.h
@interface Subclass_of_NSView : NSView
@end
// Subclass_of_NSView.m
@implementation Subclass_of_NSView
- (instancetype)initWithFrame:(NSRect)frame
//______________^ WARNING: Method definition for resizeSubviewsWithOldSize: not found
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
Swift(扩展Obj-C子类)
// Extension_of_Subclass.swift
import Foundation
extension Subclass_of_NSView {
override func resizeSubviewsWithOldSize( old_bounds_size:NSSize ) {
}
} …Run Code Online (Sandbox Code Playgroud) 我在SVG观察鼠标事件中有一些javascript,需要将鼠标坐标转换为SVG空间中的实际坐标(使用viewBox和其他转换).
此代码适用于WebKit/Gecko浏览器:
function transformEventCoordsToNodeCoords(evt,node)
{
var point = document.documentElement.createSVGPoint();
point.x = evt.clientX;
point.y = evt.clientY;
var ctm = node.getScreenCTM();
return point.matrixTransform(ctm.inverse());
}
Run Code Online (Sandbox Code Playgroud)
在IE 9中,getScreenCTM()抛出异常:
Unexpected call to method or property access.
Run Code Online (Sandbox Code Playgroud)
我发现在线示例代码表明我的代码是正确的,我甚至发现了一个似乎使用完全相同的技术的SVG,它在IE 9中有效:
有谁知道为什么我的代码失败了?
注意:node变量是<rect>:
<rect id=?"tooltip_box" x=?"698.7705078125" y=?"278.19676208496094" rx=?"20" ry=?"20" width=?"310" height=?"165" class=?"tooltip_box_region_level_1">?</rect>?
Run Code Online (Sandbox Code Playgroud)
PS:将此SVG上传到可公开访问的服务器很困难.
我如何使用-[NSCoder encodeBytes:length:]和-[NSCoder decodeBytesWithReturnedLength:]双倍?
我有一个符合NSCoding两个double属性的对象,我目前正在使用NSNumber编码/解码值:
- (id)initWithCoder:(NSCoder *)decoder
{
if (!(self = [super init]))
return nil;
latitude = [(NSNumber *)[decoder decodeObject] doubleValue];
longitude = [(NSNumber *)[decoder decodeObject] doubleValue];
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:[NSNumber numberWithDouble:latitude]];
[coder encodeObject:[NSNumber numberWithDouble:longitude]];
}
Run Code Online (Sandbox Code Playgroud)
然而,这给了我不可接受的性能(用我的测试数据解码6秒,这比生产数据小得多).
如果我使用密钥,我可以使用-encodeDouble:forKey:,但我没有使用密钥(它们很慢),而且与Mac OS X不同-encodeDouble:,iOS上没有方法.
所以,我需要使用encodeBytes:length:和decodeBytesWithReturnedLength:,但我的C能力非常有限.我不确定如何在void *和之间进行转换double.
我在javascript中使用Canvas创建了一个简单的二进制时钟,在Chrome/Safari中创建了一个简单的二进制时钟,即使我每秒都要多次绘制到画布,它每秒只更新一次屏幕.
FireFox正在更新我绘制到画布的瞬间,我认为我的代码是高效的(活动监视器说,当动画运行时,浏览器使用单个CPU核心的5%到10%).
如何更频繁地更新webkit浏览器?我的实际代码是在jsfiddle:
但基本上这就是我正在做的事情:
function updateCanvas()
{
if (!canvasNeedsUpdating()) {
return;
}
var ctx = blockView.getContext("2d");
ctx.clearRect(0, 0, width, height);
if (canvasNeedsFill()) {
ctx.fillStyle = "rgba(255,255,255,1.0)";
ctx.fillRect(0, 0, width, height);
}
window.setTimeout(updateCanvas, 10);
}
Run Code Online (Sandbox Code Playgroud) objective-c ×3
cocoa ×2
appkit ×1
canvas ×1
command-line ×1
crash ×1
double ×1
exception ×1
foundation ×1
ios ×1
javascript ×1
nscoding ×1
performance ×1
svg ×1
swift ×1
webkit ×1