标签: core-foundation

CoreFoundation框架的目的是什么?

我使用NSObjects等在Objective-C Cocoa中编程了一段时间.我看到还有另一个框架:CoreFoundation.我看一下,它似乎是一个C风格的框架.

所以我有一些好奇心,我想澄清一下.我用谷歌搜索,但没有找到直接答案.

  1. CoreFoundation框架的目的是什么?
  2. Cocoa Framework不提供已经需要的所有东西吗?
  3. CoreFoundation Framework是否提供了CocoaFramework无法提供的任何优势?

这些是我的一些问题.如果有人能够提供答案,或者为我提供阅读资源的资源,那就太棒了.我想知道它是否值得更多地了解该框架.

cocoa objective-c core-foundation

22
推荐指数
2
解决办法
6959
查看次数

如何将CFArray转换为Swift数组?

根据Apple的"使用Swift with Cocoa和Objective-C","在Swift中,您可以互换使用每对免费桥接基础和Core Foundation类型".这使得使用Core Foundation的声音比实际更简单...

我正在尝试使用从CoreText返回的CFArray.我有这个代码:

let lines: CFArrayRef  = CTFrameGetLines(frame)
Run Code Online (Sandbox Code Playgroud)

我看到两种可能的方法来访问这个数组的成员.现在也没有为我工作.


方式#1 - 直接使用CFArray

let line: CTLineRef = CFArrayGetValueAtIndex(lines, 0)
Run Code Online (Sandbox Code Playgroud)

这会产生错误"'ConstUnsafePointer <()>',不能转换为'CTLineRef'".转换似乎不会改变此错误.

同样,我很乐意将"可互换"的行用作Swift数组,就像我说的那样.然而,

let line: CTLineRef = lines[0]
Run Code Online (Sandbox Code Playgroud)

产生错误"'CFArrayRef'没有名为'subscript'的成员"


方式#2 - 将CFArray转换为Swift数组

var linesArray: Array = [CTLineRef]()
linesArray = bridgeFromObjectiveC(lines, linesArray.dynamicType)
Run Code Online (Sandbox Code Playgroud)

在这里,我声明了一个Swift数组并将其设置为等同于桥接的CFArray.这个编译没有错误,但是当我运行它时,我在第二行遇到EXC_BREAKPOINT崩溃.也许我没有在这个上正确使用Swift语言......

core-foundation nsarray swift

22
推荐指数
3
解决办法
9778
查看次数

为什么CFRelease(NULL)会崩溃?

CFRelease没有检查NULL的原因吗?当[nil release]时,这不是不可接受的; 自由(NULL); 删除NULL; 一切都很好吗?

objective-c core-foundation

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

对于CF类型,带有__attribute __((NSObject))的强大@property不会保留

更新:此问题已在Xcode 4.6中修复!

此技术现在再次按预期工作.但是,在您的代码中使用之前,请务必阅读Rob Napier优秀答案顶部的注释.

原始邮政

(ARC,Xcode 4.3.1,iOS 5.1)

我有一个CF类型(CGImage)的强大属性,我希望由ARC自动管理__attribute__((NSObject))(如在合成的setter中保留和释放,并且它在dealloc中没有),但是它不起作用:分配属性时不保留对象.

重现的最小例子:

@interface TestClass : NSObject
@property (nonatomic, strong) __attribute__((NSObject)) CFStringRef str;
@end

// ...In some function
CFStringRef str = (__bridge CFStringRef)[NSString stringWithFormat:@"%g", 2.5];
NSLog(@"%ld", CFGetRetainCount(str));
TestClass *obj = [[TestClass alloc] init];
obj.str = str;
NSLog(@"%ld", CFGetRetainCount(str));
Run Code Online (Sandbox Code Playgroud)

其中两次打印"1".

现在奇怪的是(虽然我不确定)我认为它在我更新到iOS 5.1和Xcode 4.3.1(来自iOS 5和Xcode 4.2)之前正常工作,并且它从gdb切换到lldb.未升级(或知道如何更改编译器)的人可能会确认吗?

objective-c core-foundation ios automatic-ref-counting

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

将plist转换为二进制plist

Apple强烈建议在将大型基于XML的数据集读入iPhone应用程序时使用二进制plist格式.他们的理由是,XML解析对iPhone非常重要.但是,这要求首先转换驻留在远程Web服务器上的文件.

对于频繁更改的内容,手动执行此操作是不可接受的.如果可能的话,我想避免让基于Web的应用程序调用命令行来执行转换(即plutil).

是否有公开的算法来执行此转换?

iphone cocoa-touch objective-c plist core-foundation

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

发布Core Foundation对象引用

我是否需要释放Core Foundation对象以清理内存?如果是这样,怎么样?

例如,在代码中:

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook);
Run Code Online (Sandbox Code Playgroud)

我需要发布peopleArray吗?怎么样addressBook

cocoa cocoa-touch objective-c core-foundation

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

为什么这个简单的CoreMIDI程序不能产生MIDI输出?

这是一个发送MIDI数据的极其简单的CoreMIDI OS X应用程序.问题是它不起作用.编译好,并运行.它报告没有错误,并且不会崩溃.创建的源在MIDI监视器中可见.但是,没有MIDI数据出来.

有人能告诉我这里我做错了什么吗?

#include <CoreMIDI/CoreMIDI.h>

int main(int argc, char *args[])
{
    MIDIClientRef   theMidiClient;
    MIDIEndpointRef midiOut;
    MIDIPortRef     outPort;
    char pktBuffer[1024];
    MIDIPacketList* pktList = (MIDIPacketList*) pktBuffer;
    MIDIPacket     *pkt;
    Byte            midiDataToSend[] = {0x91, 0x3c, 0x40};
    int             i;

    MIDIClientCreate(CFSTR("Magical MIDI"), NULL, NULL,
                     &theMidiClient);
    MIDISourceCreate(theMidiClient, CFSTR("Magical MIDI Source"),
                     &midiOut);
    MIDIOutputPortCreate(theMidiClient, CFSTR("Magical MIDI Out Port"),
                         &outPort);

    pkt = MIDIPacketListInit(pktList);
    pkt = MIDIPacketListAdd(pktList, 1024, pkt, 0, 3, midiDataToSend);

    for (i = 0; i < 100; i++) {
        if (pkt == NULL || MIDISend(outPort, midiOut, …
Run Code Online (Sandbox Code Playgroud)

macos midi core-foundation coremidi

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

在Mac OS X中获得"全局"鼠标位置

我怎样才能进入Mac OS X"全局"鼠标位置 - 我的意思是我怎么能在cocoa/cf /中查找光标位置,即使它在窗外,即使我的窗口处于非活动状态?

我知道它在某种程度上是可能的(即使没有管理员权限),因为我在Java中看到过类似的东西 - 但我想在ObjC中编写它

抱歉我的英语 - 我希望你明白我的意思;)

macos cocoa core-foundation

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

如何在Swift中从CGImage创建UIImage?

我正在尝试UIImage从该ALAssetsGroup#posterImage方法创建一个.在Objective-C中,我可以简单地调用[UIImage imageWithCGImage:group.posterImage]但在Swift中,UIImage(CGImage: group.posterImage)给我一个编译器错误:

Could not find an overload for 'init' that accepts the supplied arguments
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

core-foundation uiimage cgimage swift

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

OSX FSEventStreamEventFlags无法正常工作

我正在观看文件系统事件的目录.一切似乎工作正常,但有一个例外.当我第一次创建文件时,它会吐出它已创建的文件.然后我可以删除它,它说它已被删除.当我再次创建同一个文件时,我同时获得了一个创建和删除的标志.我很明显误解了在调用回调时如何设置标志.这里发生了什么?

//
//  main.c
//  GoFSEvents
//
//  Created by Kyle Cook on 8/22/13.
//  Copyright (c) 2013 Kyle Cook. All rights reserved.
//

#include <CoreServices/CoreServices.h>
#include <stdio.h>
#include <string.h>

void eventCallback(FSEventStreamRef stream, void* callbackInfo, size_t numEvents, void* paths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]) {
    char **pathsList = paths;

    for(int i = 0; i<numEvents; i++) {
        uint32 flag = eventFlags[i];

        uint32 created = kFSEventStreamEventFlagItemCreated;
        uint32 removed = kFSEventStreamEventFlagItemRemoved;

        if(flag & removed) {
            printf("Item Removed: %s\n", pathsList[i]);
        }
        else if(flag …
Run Code Online (Sandbox Code Playgroud)

c macos core-foundation fsevents

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