使用OS X上的框架,我可以使用以下内容将PNG复制到粘贴板(在C中 - 显然我可以将NSPasteboard与Cocoa一起使用):
#include <ApplicationServices/ApplicationServices.h>
int copyThatThing(void)
{
PasteboardRef clipboard;
if (PasteboardCreate(kPasteboardClipboard, &clipboard) != noErr) {
return -1;
}
if (PasteboardClear(clipboard) != noErr) {
CFRelease(clipboard);
return -1;
}
size_t len;
char *pngbuf = createMyPNGBuffer(&len); /* Defined somewhere else */
if (pngbuf == NULL) {
CFRelease(clipboard);
return -1;
}
CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, pngbuf,
len, kCFAllocatorNull);
if (data == NULL) {
CFRelease(clipboard);
free(pngbuf);
return -1;
}
OSStatus err;
err = PasteboardPutItemFlavor(clipboard, NULL, kUTTypePNG, data, 0);
CFRelease(clipboard);
CFRelease(data);
free(pngbuf);
return 0; …Run Code Online (Sandbox Code Playgroud) 有没有办法模拟块中的break语句dispatch_apply()?
例如,我见过处理枚举块的每个Cocoa API都有一个"停止"参数:
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger i, BOOL *stop) {
if ([obj isNotVeryNice]) {
*stop = YES; // No more enumerating!
} else {
NSLog(@"%@ at %zu", obj, i);
}
}];
Run Code Online (Sandbox Code Playgroud)
GCD有类似的东西吗?
cocoa objective-c break grand-central-dispatch objective-c-blocks
我正在使用QTKit逐步从URL下载和播放MP3.根据此文档,这是我应该用来完成的代码:
NSURL *mp3URL = [NSURL URLWithString:@"http://foo.com/bar.mp3"];
NSError *error = nil;
QTMovie *sound = [[QTMovie alloc] initWithURL:mp3URL error:&error];
[sound play];
Run Code Online (Sandbox Code Playgroud)
这有效,并且完全符合我的要求 - MP3 URL被懒散地下载并立即开始播放.但是,如果URL没有".mp3"路径扩展名,则会失败:
NSURL *mp3URL = [NSURL URLWithString:@"http://foo.com/bar"];
NSError *error = nil;
QTMovie *sound = [[QTMovie alloc] initWithURL:mp3URL error:&error];
[sound play];
Run Code Online (Sandbox Code Playgroud)
没有给出错误,没有引发异常; 声音的持续时间只是设置为零,没有任何播放.
我找到解决此问题的唯一方法是通过手动加载数据并使用QTDataReference强制类型:
NSURL *mp3URL = [NSURL URLWithString:@"http://foo.com/bar"];
NSData *mp3Data = [NSData dataWithContentsOfURL:mp3URL];
QTDataReference *dataReference =
[QTDataReference dataReferenceWithReferenceToData:mp3Data
name:@"bar.mp3"
MIMEType:nil];
NSError *error = nil;
QTMovie *sound = [[QTMovie alloc] initWithDataReference:dataReference error:&error];
[sound play];
Run Code Online (Sandbox Code Playgroud)
然而,这迫使我在开始播放之前同步完全下载所有MP3,这显然是不可取的.有没有办法解决?
谢谢.
实际上,路径扩展似乎与它无关; …
我不会详细介绍,但我试图实现类似于Boyer-Moore-Horspool算法的算法,只使用十六进制颜色值而不是字符(即,范围更大).
按照维基百科上的例子,我最初有这个:
size_t jump_table[0xFFFFFF + 1];
memset(jump_table, default_value, sizeof(jump_table);
Run Code Online (Sandbox Code Playgroud)
但是,0xFFFFFF显然是一个巨大的数字,这很快导致C出现seg-fault(但不是堆栈溢出,令人失望).
基本上,我需要的是一个有效的关联数组映射整数到整数.我正在考虑使用哈希表,但是对于每个条目都有一个malloc'd结构对我来说似乎有些过分(我也不需要生成哈希值,因为每个键都是一个唯一的整数,并且不能有重复的条目).
有没有人有任何建议的替代方案?我对此过于务实吗?
对于那些感兴趣的人,我最终通过uthash库使用哈希表.
如何使用Python C API模拟以下Python函数?
def foo(bar, baz="something or other"):
print bar, baz
Run Code Online (Sandbox Code Playgroud)
(即,可以通过以下方式调用它:
>>> foo("hello")
hello something or other
>>> foo("hello", baz="world!")
hello world!
>>> foo("hello", "world!")
hello, world!
Run Code Online (Sandbox Code Playgroud)
)
c ×3
cocoa ×2
objective-c ×2
algorithm ×1
break ×1
copy-paste ×1
linux ×1
mp3 ×1
pasteboard ×1
python ×1
python-c-api ×1
qtkit ×1
x11 ×1