小编Abh*_*ert的帖子

在Ruby中创建一个空文件:"触摸"等效?

在Ruby中创建文件的最佳方法是什么?

类似于Unix命令,触摸:

touch file.txt
Run Code Online (Sandbox Code Playgroud)

ruby file

112
推荐指数
3
解决办法
4万
查看次数

生成启用了ARC的UUID字符串

我需要在启用ARC的某些代码中生成UUID字符串.

做了一些研究之后,这就是我提出的:

CFUUIDRef uuid = CFUUIDCreate(NULL);
NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);
Run Code Online (Sandbox Code Playgroud)

我是否正确使用__bridge_transfer以避免在ARC下泄漏任何物体?

objective-c automatic-ref-counting

71
推荐指数
3
解决办法
3万
查看次数

在NSTextStorage中混淆编码异常

我有一个简单的文本编辑器的NSDocument子类(使用Lion的基于新文档的应用程序模板,几乎没有自定义),我遇到了一个奇怪的错误,将文件内容加载到文本存储中.

这是我的代码:

- (void)loadTextContentIntoStorage
{
  if (!self.textStorage || !textContentToLoad)
    return;

  ...

  [self.textStorage beginEditing];

//  NSLog(@"storage: %@ length: %lu textContent: %@", self.textStorage, (unsigned long)self.textStorage.length, textContentToLoad);
//  [self.textStorage replaceCharactersInRange:NSMakeRange(0, self.textStorage.length) withString:textContentToLoad];
  [self.textStorage replaceCharactersInRange:NSMakeRange(0, 0) withString:@"hello world"];

  ..

  [self.textStorage endEditing];
}
Run Code Online (Sandbox Code Playgroud)

当我发生错误时:

  • 在Xcode中运行应用程序(作为调试版本)
  • 打开任何文件
  • 退出应用程序(不关闭文档)
  • 再次从Xcode运行应用程序

它崩溃-replaceCharactersInRange:withString:了"无法将字符串0x10004d430中的字节转换为_NSCStringEncoding".

但它只是发生在每一推出的应用程序(第三发射不会崩溃,它自动重新打开它坠毁试图打开上次的文件).它也只发生在我从Xcode运行应用程序时.发布版本从未在发布时崩溃.

我认为这可能是自动保存系统的编码问题,但是当我注释掉该代码并将@"hello world"字符串加载到文本视图中时它甚至会崩溃(如上面的代码所示).同样,注释掉NSLog()并没有显示任何奇怪的东西.文本存储有效(从xib文件加载),文本存储长度为0,textContent是要打开的文件的内容.

---编辑---

我已经知道这个问题在某种程度上与com.apple.security.app-sandbox权利有关.如果启用了权利/沙箱,那么我的应用程序不会崩溃.如果禁用了权利或app-sandbox功能,那么我的应用程序会在尝试恢复以前打开的文档的每次启动时崩溃.

我只注意到在xcode内部进行构建/运行时崩溃,因为这是我唯一一个禁用沙箱的构建配置.

--- /编辑---

有没有人有任何想法?完整的例外如下,完整的源代码在github上:https://github.com/abhibeckert/Dux/blob/master/Dux/DuxTextView.m

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', …
Run Code Online (Sandbox Code Playgroud)

macos cocoa objective-c nstextstorage

20
推荐指数
2
解决办法
936
查看次数

在vim中打开一个目录

我是一个mac用户,认真对待vim.我用过的大多数GUI编辑器都允许我通过执行如下命令来打开目录作为"项目":

编辑〜/ www/example.com /

vim等价物vim ~/www/example.com/将显示目录中的文件列表,我可以打开它们.但它没有将vim的工作目录设置为该路径,我必须运行:cd .以设置工作目录.

有没有办法,也许有一个shell脚本,打开vim并将它的工作目录设置为给定的路径?

我实际上正在使用MacVim,如果这有任何区别的话.

vi vim macvim

18
推荐指数
3
解决办法
2万
查看次数

supportInterfaceOrientations更改时如何通知系统?

我的根视图控制器的实现supportedInterfaceOrientations几乎总是返回UIInterfaceOrientationMaskAll,但是有一个返回的边缘情况UIInterfaceOrientationMaskLandscape.

如果用户旋转设备,这是有效的.但是,如果设备处于纵向模式supportedInterfaceOrientations,则除非用户手动旋转设备,否则不会调用该方法.

如何以编程方式告诉系统此方法的返回值已更改?

根据文档,似乎我应该能够调用,[UIViewController attemptRotationToDeviceOrientation]但这没有任何影响(supportedInterfaceOrientations从未调用,屏幕不旋转).

我找到了其他人发布的各种解决方法来尝试解决这个问题,但是我的测试中没有一个可以工作.我怀疑他们可能在iOS 5.0中工作,但不是iOS 6.0.

YES在根视图控制器的shouldAutorotate方法中返回.

rotation uiviewcontroller uikit ios

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

Int to Double cast问题

我是一名具有很少C/C++经验(并且没有培训)的Objective-C开发人员,今天我遇到了一些奇怪的硬编码数值.

我确定这是一个简单/愚蠢的问题,但有人可以解释为什么这样做:

NSDate *start = [NSDate date];
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC);

dispatch_after(popTime, dispatch_get_main_queue(), ^{
  NSLog(@"seconds: %f", [start timeIntervalSinceNow]);
});
// output: seconds: -1.0001
Run Code Online (Sandbox Code Playgroud)

这也有效(注意秒数已经改变):

NSDate *start = [NSDate date];
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC);

dispatch_after(popTime, dispatch_get_main_queue(), ^{
  NSLog(@"seconds: %f", [start timeIntervalSinceNow]);
});
// output: seconds: -2.0001
Run Code Online (Sandbox Code Playgroud)

但这是立即执行的:

NSDate *start = [NSDate date];
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 4 * NSEC_PER_SEC);

dispatch_after(popTime, dispatch_get_main_queue(), ^{
  NSLog(@"seconds: %f", [start timeIntervalSinceNow]);
});
// output: seconds: -0.0001
Run Code Online (Sandbox Code Playgroud)

但是,使用4.0而不是4 …

c cocoa objective-c grand-central-dispatch

13
推荐指数
2
解决办法
6593
查看次数

iOS上的活动监视器中的实时字节与实内存

我正在开发一个iOS应用程序,它将创建许多小对象和浮动,并试图了解它消耗了多少内存使用量.

当我运行"分配"工具时,它说我有大约2MB的"实时字节",当我在应用程序中移动时,数字大致保持不变(当应用程序繁忙时,峰值达到3MB左右,但随后又下降低至2MB).

但是当我运行"Activity Monitory"乐器时,我的应用程序的"真实内存"一旦完成启动就会达到25MB,并且在我的CALayer中进行绘制时会快速增长.在不到一分钟的时间里,它超过了100MB.

为什么"Live Bytes"显示2MB,但"Real Memory"显示100MB?

我的CALayer正在绘制大量的路径,它将CPU固定为100%几秒钟才完成单个绘制操作,并且它将所有这些点从NSData对象加载到CGPoint值中,然后再次释放它们(NSData) object是被绘制点的压缩版本,存储从一个点到下一个点的增量,所以我将它保存在RAM中但不保留实际的CGPoints).

它还将绘图的结果缓存在UIImage中,并且它们保存在先进先出的数组中,该数组不会增长到超过500KB.

memory-leaks objective-c instruments ios

10
推荐指数
2
解决办法
5368
查看次数

+ initialize被调用不止一次

我有一个+initialize被多次调用的方法,我不明白为什么.

根据文档,它将为每个类(以及子类)调用一次,

这是我正在使用的代码:

@interface MyClass : NSObject

@end

static NSArray *myStaticArray;

@implementation MyClass

+ (void)initialize
{
  myStaticArray = [NSArray array];
}

@end
Run Code Online (Sandbox Code Playgroud)

(显然还有其他代码,但这是相关部分).

没有子类MyClass.它没有任何花哨的东西.当我的应用程序启动时,+ initialize被调用一次(NSApplication的委托告诉它用磁盘中的数据填充myStaticArray).然后第二次调用+ initialize,这是用户第一次选择与此类相关的菜单项.

我只是添加dispatch_once()了我的initialize代码,这显然解决了我的问题.但我不明白发生了什么事?当没有子类时,为什么会多次调用它?

这是第一次调用初始化时的堆栈跟踪:

+[MyClass initialize]
_class_initialize
objc_msgSend
-[MyAppDelegate applicationDidBecomeActive:]
_CFXNotificationPost
NSApplicationMain
main
start
Run Code Online (Sandbox Code Playgroud)

这是第二个电话:

+[MyClass initialize]
_class_initialize
NSApplicationMain
main
start
Run Code Online (Sandbox Code Playgroud)

如您所见,我的代码似乎没有触发第二次调用+ initialize(堆栈跟踪中没有任何内容).它我显示一个窗口立即出现,+initialize该窗口显示清除的静态数组的内容(窗口显示数组内容,但在此之后数组为空).

cocoa objective-c

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

如何在后台窗口中设置[NSTextView selectedTextAttributes]?

[NSTextView selectedTextAttributes]我的应用程序中的默认值无法使用,因为我允许用户选择与背景颜色几乎完全相同的颜色(语法突出显示).

我已经写了一些数学来确定合适的颜色,可以使用它来设置它:

textView.selectedTextAttributes = @{
  NSBackgroundColorAttributeName: [NSColor yellowColor],
  NSForegroundColorAttributeName: [NSColor redColor]
  };
Run Code Online (Sandbox Code Playgroud)

但是当窗口在后台时,它仍然使用系统默认的浅灰色.

我已经使用活动与非活动窗口附加了上述代码的屏幕截图. - 如何更改非活动窗口的选定文本背景颜色?

活性 待用

cocoa objective-c nstextview

8
推荐指数
2
解决办法
1312
查看次数

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

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

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

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

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

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

cocoa command-line foundation appkit

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