有没有一种简单的方法将 a 转换CTypeRef为特定的 CoreFoundation 类型?我不想进行内联转换,(CFStringRef)myObjectRef但想创建一个辅助方法来为所有 CoreFoundation 类型执行此操作。
我知道可以使用类似的方法CFGetTypeID(myObjectRef) == CFStringGetTypeID()来确定 a 是否CTypeRef是 a CFString。然而,创建单个方法来执行此操作可能会变得非常冗长并且有很多 if 语句。
构建一个带有一堆 if 语句的方法是CFGetTypeID()唯一的方法吗?或者有更简单的方法来做到这一点吗?
更新:举例
我想创建一个辅助函数来处理一些我无法更改的遗留代码。目前,它生成 之一CFDictionaryRef,CFStringRef或CFURLRef作为作为 a 提供的返回值CTypeRef。我目前正在通过运行CFGetTypeID()返回值来解决这个问题,但这并不理想。与其到处都有 C 风格的强制转换,我宁愿有一个CastToCF()助手来帮我处理这个问题。这也将有助于使未来的测试变得更加容易。
PS 我不担心可变类型。
我如何转换typedef signed long CFIndex为typedef unsigned int NSUInteger?
CFIndex如果我使用 a作为类型的参数可以吗NSUInteger?我还没有铸造它,编译者似乎也不介意。编译器只是为我做转换吗?
我仅限于在特定应用程序中使用 CoreFoundation,并且无权访问NSData.
我需要使用内存映射从文件访问数据,因为文件可能非常大。使用NSData,我可以使用+dataWithContentsOfURL:options:error:方法来实现这一点,传入NSDataReadingMappedAlways选项。
有可能做到这一点CFData吗?我能找到的唯一一个CFData直接从文件创建对象的CFURLCreateDataAndPropertiesFromResource()函数是函数,它没有任何设置内存映射标志的选项。
是否有CFData使用内存映射读取从文件加载对象的低级方法?我必须下降到mmap什么地方吗?
在类似的语言中C++,C#当您创建包含诸如a std::vector或a C# list之类的语言时,在创建容器类型时显式声明容器类型:
C++:
std::vector<MyObject>
Run Code Online (Sandbox Code Playgroud)
C#:
List<MyObject> list = new List<MyObject>();
Run Code Online (Sandbox Code Playgroud)
看看上面的代码,我立即知道这些容器只能包含类型MyObject的对象,如果我尝试添加一个不属于这种类型的对象,编译器会抱怨.
由于Objective-C是一种动态语言,我们没有编译器的特权警告我们(因为它是完全有效但有潜在危险的事情):
Objective-C的:
NSDictionary *dict = [[NSDictionary alloc]init];
[dict setValue:[[SomeClass alloc]init] forKey:@"someClass"];
[dict setValue:[[NSMutableString alloc]init] forKey:@"mutableString"];
BOOL classIsSomeClass = [[dict objectForKey:@"someClass"] isKindOfClass:[SomeClass class]];
Run Code Online (Sandbox Code Playgroud)
相反,类似于NSDictionary或NSArray将存储和接受任何类型的对象继承自NSObject.我发现这本身非常灵活,但我无法确定容器中的对象类型我只能真正知道,runtime而我c++或者只是通过查看代码.c#compile time
当添加,使用及移除容器类对象(我应该确认容器的内容NSArray,NSSet,NSDictionary来自苹果等),基础架构?或者在所有情况下都可以,并且验证会损害性能吗?:
NSDictionary *dict = [[NSDictionary alloc]init];
[dict objectForKey:@"someKey"]; // return nil?
Run Code Online (Sandbox Code Playgroud) 我发现了一个主要用于CFBinaryHeap工作的优先级队列的实现.
我目前正在使用-fno-objc-arc编译器标志在编译这些文件时跳过ARC的使用.我尝试更新此代码以利用ARC,尽管我遇到了一些理解障碍.
这里有没有人更新类似于此的代码用于ARC?
你如何处理之类的东西free(),和CFRelease()?我们可以摆脱它们吗?
你有什么用做retain和release你创建的方法CFBinaryHeapCallBacks?
您是否使用__bride或__bridge_transfer引用const void *Objective-C对象?同样,你应该使用(__bridge_retained void *)或obj_unretainedPointer()反过来吗?
objective-c priority-queue core-foundation ios automatic-ref-counting
我试图从iOS中的图像资源中读取ARGB像素.为此,我需要一个CGImageRef我可以使用它来获得它CGDataProvider.我的问题是,如果我创建一个CGImageRef使用:
CGImageRef cg = [[UIImage imageNamed: Path] CGImage];
Run Code Online (Sandbox Code Playgroud)
我最终还需要打电话CGImageRelease(cg)吗?如果我不打电话CGImageRelease,我会有内存泄漏吗?
我遇到的另一个问题是第二次读同一个文件会返回一个空图像,我怀疑这可能是因为我CGImageRelease第一次没有打电话.
有人能告诉我为什么会泄漏吗?我正在使用CFRelease(),我认为它发布了CFURLRef soundFileURLRef
调用函数'CFBridgingRetain'返回一个Core Foundation对象,其中+1保留计数
对象泄露:在此执行路径中未分配对象,并且保留计数为+1
-(void) playGuitarNote:(NSString *)noteVal {
AudioServicesDisposeSystemSoundID(soundId);
CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef soundFileURLRef = CFBundleCopyResourceURL(mainBundle,CFBridgingRetain(noteVal), CFSTR("aiff"), NULL);
AudioServicesCreateSystemSoundID(soundFileURLRef, &soundId);
AudioServicesPlaySystemSound(soundId);
CFRelease(soundFileURLRef);
noteVal = nil;
}
Run Code Online (Sandbox Code Playgroud) 我有清除设备中地址簿的方法。方法如下。
-(void) clearAdressBook
{
ABAddressBookRef addrBook=ABAddressBookCreate();
CFArrayRef groups = ABAddressBookCopyArrayOfAllGroups(addrBook);
if(groups)
{
CFIndex numGroups = CFArrayGetCount(groups);
for(CFIndex idx=0; idx<numGroups; ++idx)
{
ABRecordRef groupItem = CFArrayGetValueAtIndex(groups, idx);
CFArrayRef people=
ABGroupCopyArrayOfAllMembers(groupItem);
if(people)
{
CFIndex peopleCount=CFArrayGetCount(people);
for(CFIndex ind=0;ind<peopleCount;++ind)
{
ABRecordRef person=CFArrayGetValueAtIndex(people, ind);
ABAddressBookRemoveRecord(addrBook, person, nil);
ABAddressBookSave(addrBook, NULL);
CFRelease(person);
}
CFRelease(people);//CRASH
}
}
}
CFRelease(groups);
}
Run Code Online (Sandbox Code Playgroud)
当我发布CFArrayRef应用程序崩溃时,这是怎么回事?据我所知,我必须释放从CF方法返回的所有对象,这些对象的名称包含复制或创建权吗?
在我的代码中,我正在创建一个Core Foundation对象,从Apple文档中我知道
“ Core Foundation对象的寿命由其引用计数决定” https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Articles/lifecycle.html
因此,我非常怀疑核心基础对象是由ARC发布还是我们需要通过编写CFRelease(myobject)进行发布
我正在使用Xcode 6.4,目前在我的代码中没有使用任何CFRelease(myobject)释放我的Core Foundation对象,但是我仍然找不到在xcode工具中的任何内存泄漏(泄漏)。
因此,我的问题是ARC是否将负责发布Core Foundation对象。
当我刚遇到一个类似的声明时,
回想一下,ARC仅处理Objective-C对象。它不管理非Objective-C对象的CoreFoundation对象的保留和释放。http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode
因此,如果有人遇到相同的问题并找到一种解决方案,请与我们分享...
提前致谢..
memory-leaks memory-management core-foundation xcode-instruments automatic-ref-counting
我正在将一些旧的Objective-C代码转换为Swift,所以我可以放弃一些不赞成使用的方法,但是我一直在崩溃,到目前为止我似乎无法弄清楚是什么导致了它.我从P12证书中获取私钥,这个方法似乎工作正常,直到我到达实际需要从CFArray获取字典的部分,即使数组中有值,应用程序也会崩溃.这是我的代码:
func privateKeyFromCertificate(p12Name: String, withPassword password: String) -> SecKeyRef {
let resourcePath: String = NSBundle.mainBundle().pathForResource(p12Name, ofType: "p12")!
let p12Data: NSData = NSData(contentsOfFile: resourcePath)!
let key : NSString = kSecImportExportPassphrase as NSString
let options : NSDictionary = [key : password]
var privateKeyRef: SecKeyRef? = nil
var items : CFArray?
let securityError: OSStatus = SecPKCS12Import(p12Data, options, &items)
let description : CFString = CFCopyDescription(items)
print(description)
if securityError == noErr && CFArrayGetCount(items) > 0 {
let objects : CFDictionaryRef = CFArrayGetValueAtIndex(items, 0) as! CFDictionaryRef …Run Code Online (Sandbox Code Playgroud) core-foundation ×10
objective-c ×8
ios ×4
cocoa ×2
macos ×2
c ×1
cfdictionary ×1
cgimage ×1
cocoa-touch ×1
foundation ×1
ios6 ×1
iphone ×1
memory-leaks ×1
swift ×1
typedef ×1