小编Abh*_*ert的帖子

命令行工具与Cocoa应用程序交互

我有一个基于Cocoa文档的应用程序(文本编辑器),我希望能够从命令行与它进行交互.

例如,我想将其设置为在命令行上键入git/svn commit消息的编辑器.

假设我使用Foundation创建命令行工具,我的命令行工具与GUI应用程序通信的最佳方法是什么?

显然,我可以使用标准的开放事件让我的应用程序打开一个特定的文件,但我还需要命令行应用程序等待GUI应用程序完成文档(用户关闭编辑器窗口),然后退出(类似于mate -w file.txtTextMate的命令)行工具,或其他各种mac文本编辑器中的等效工具).

TextMate 2 使用套接字文件.这是最好的方法吗?如果可能的话,我想使用更高级别的东西NSDistributedNotificationCenter.

cocoa command-line foundation appkit

7
推荐指数
1
解决办法
859
查看次数

Objective-C奇怪的EXC_BAD_ACCESS

我的代码崩溃了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行).

crash cocoa objective-c

7
推荐指数
1
解决办法
4293
查看次数

Swift扩展"未找到方法定义"

我正在为我的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)

objective-c swift

6
推荐指数
1
解决办法
3825
查看次数

在IE 9中SVG的node.getScreenCTM()方法失败

我在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上传到可公开访问的服务器很困难.

internet-explorer svg exception

3
推荐指数
1
解决办法
1819
查看次数

编码/解码使用NSCoding加倍

我如何使用-[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.

double objective-c nscoding ios

2
推荐指数
1
解决办法
1964
查看次数

WebKit浏览器缓慢更新画布

我在javascript中使用Canvas创建了一个简单的二进制时钟,在Chrome/Safari中创建了一个简单的二进制时钟,即使我每秒都要多次绘制到画布,它每秒只更新一次屏幕.

FireFox正在更新我绘制到画布的瞬间,我认为我的代码是高效的(活动监视器说,当动画运行时,浏览器使用单个CPU核心的5%到10%).

如何更频繁地更新webkit浏览器?我的实际代码是在jsfiddle:

http://jsfiddle.net/mqGKR/

但基本上这就是我正在做的事情:

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)

javascript performance webkit canvas

1
推荐指数
1
解决办法
278
查看次数