我需要在启用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下泄漏任何物体?
我有一个简单的文本编辑器的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)
当我发生错误时:
它崩溃-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) 我是一个mac用户,认真对待vim.我用过的大多数GUI编辑器都允许我通过执行如下命令来打开目录作为"项目":
编辑〜/ www/example.com /
vim等价物vim ~/www/example.com/
将显示目录中的文件列表,我可以打开它们.但它没有将vim的工作目录设置为该路径,我必须运行:cd .
以设置工作目录.
有没有办法,也许有一个shell脚本,打开vim并将它的工作目录设置为给定的路径?
我实际上正在使用MacVim,如果这有任何区别的话.
我的根视图控制器的实现supportedInterfaceOrientations
几乎总是返回UIInterfaceOrientationMaskAll
,但是有一个返回的边缘情况UIInterfaceOrientationMaskLandscape
.
如果用户旋转设备,这是有效的.但是,如果设备处于纵向模式supportedInterfaceOrientations
,则除非用户手动旋转设备,否则不会调用该方法.
如何以编程方式告诉系统此方法的返回值已更改?
根据文档,似乎我应该能够调用,[UIViewController attemptRotationToDeviceOrientation]
但这没有任何影响(supportedInterfaceOrientations
从未调用,屏幕不旋转).
我找到了其他人发布的各种解决方法来尝试解决这个问题,但是我的测试中没有一个可以工作.我怀疑他们可能在iOS 5.0中工作,但不是iOS 6.0.
我YES
在根视图控制器的shouldAutorotate
方法中返回.
我是一名具有很少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 …
我正在开发一个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.
我有一个+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
该窗口显示清除的静态数组的内容(窗口显示数组内容,但在此之后数组为空).
[NSTextView selectedTextAttributes]
我的应用程序中的默认值无法使用,因为我允许用户选择与背景颜色几乎完全相同的颜色(语法突出显示).
我已经写了一些数学来确定合适的颜色,可以使用它来设置它:
textView.selectedTextAttributes = @{
NSBackgroundColorAttributeName: [NSColor yellowColor],
NSForegroundColorAttributeName: [NSColor redColor]
};
Run Code Online (Sandbox Code Playgroud)
但是当窗口在后台时,它仍然使用系统默认的浅灰色.
我已经使用活动与非活动窗口附加了上述代码的屏幕截图. - 如何更改非活动窗口的选定文本背景颜色?
我有一个基于Cocoa文档的应用程序(文本编辑器),我希望能够从命令行与它进行交互.
例如,我想将其设置为在命令行上键入git/svn commit消息的编辑器.
假设我使用Foundation创建命令行工具,我的命令行工具与GUI应用程序通信的最佳方法是什么?
显然,我可以使用标准的开放事件让我的应用程序打开一个特定的文件,但我还需要命令行应用程序等待GUI应用程序完成文档(用户关闭编辑器窗口),然后退出(类似于mate -w file.txt
TextMate的命令)行工具,或其他各种mac文本编辑器中的等效工具).
TextMate 2 使用套接字文件.这是最好的方法吗?如果可能的话,我想使用更高级别的东西NSDistributedNotificationCenter
.
objective-c ×6
cocoa ×5
ios ×2
appkit ×1
c ×1
command-line ×1
file ×1
foundation ×1
instruments ×1
macos ×1
macvim ×1
memory-leaks ×1
nstextview ×1
rotation ×1
ruby ×1
uikit ×1
vi ×1
vim ×1