我正在尝试将SFHF钥匙串类(从这里开始)与IOS 5项目一起使用.我成功转换了大部分课程,以遵守新的ARC规则.
我对代码的一小部分有一些麻烦,如下所示
OSStatus status = SecItemCopyMatching((CFDictionaryRef) objc_unretainedPointer(attributeQuery), (CFTypeRef *) objc_unretainedPointer(&attributeResult)
Run Code Online (Sandbox Code Playgroud)
这给出了以下语法问题:
warning: Semantic Issue: Incompatible pointer types passing 'NSDictionary *__strong *' to parameter of type 'id'
Run Code Online (Sandbox Code Playgroud)
我对iOS开发很陌生,这让我现在非常难过.任何帮助是极大的赞赏.
如果我将一个对象放入NSDictionary中会有一个强大的指针吗?我只是想确保它不会被删除(使用ARC),而我仍然需要它.
我正在研究一些Objective-C代码,我希望将其转移到一个库中,或者至少与其他人共享.它需要使用ARC,如果未启用ARC,则会泄漏内存.
如果关闭ARC,使代码无法编译的正确方法是什么?
因为如果运行Instruments并选择了活动监视器,则在iPhone 4S上运行的应用程序在发布上下文时使用4.88MB,如果未发布上下文,则使用4.88MB .这是否意味着释放上下文是可选的?(我认为实际上是必需的).上下文由CGContextRef变量引用.(正在使用ARC).
CGBitmapContext为Retina显示器创建了上下文,因此大约640 x 640,并且有4个这样的上下文,它们都是在中创建的viewDidAppear,我认为如果1个像素是4个字节,那么每个上下文已经是1.6MB.可能是在viewDidAppear完成后,上下文会自动释放?基本上,我CGImage从那些位图上下文生成对象并将CGImage对象设置为由对象指向CALayer(使用layer.contents = (__bridge id) cgImage;),因此不再需要位图上下文.它使用Xcode 4.3编译,使用ARC,并针对iOS 4.3.(但我认为CGContextRef不是ARC的一部分).
更新:更正:应该是"从那些CGBitmapContext生成CGImage对象,并将这些CGImage对象设置为CALayer"(编辑原始问题以反映这一点).
core-animation core-graphics ios automatic-ref-counting cgcontextref
我正在开发一款带有ARC的cocos2d的游戏.游戏在模拟器中构建和运行良好,但是当我构建设备时,我得到了Apple Mac-O Linker Errors,说我错过了libcocos2d.a等的库.
clang: error: no such file or directory: '/Users/aleksandartrpeski/Library/Developer/Xcode/DerivedData/jellyfish-fsomqwhqasishxcfzhgvccrdvzpt/Build/Products/Debug-iphoneos/libcocos2d.a'
clang: error: no such file or directory: '/Users/aleksandartrpeski/Library/Developer/Xcode/DerivedData/jellyfish-fsomqwhqasishxcfzhgvccrdvzpt/Build/Products/Debug-iphoneos/libCocosDenshion.a'
clang: error: no such file or directory: '/Users/aleksandartrpeski/Library/Developer/Xcode/DerivedData/jellyfish-fsomqwhqasishxcfzhgvccrdvzpt/Build/Products/Debug-iphoneos/libkazmath.a'
clang: error: no such file or directory: '/Users/aleksandartrpeski/Library/Developer/Xcode/DerivedData/jellyfish-fsomqwhqasishxcfzhgvccrdvzpt/Build/Products/Debug-iphoneos/liblibpng.a'
Run Code Online (Sandbox Code Playgroud)
当我去文件丢失的文件夹时,我只看到了jellyfish.app.
我在这类问题上没有多少经验,我不清楚为什么会这样,我检查了如何从TinyTimGames和LearnCocos2D启动项目,仍然不清楚我做错了什么.
xcode mach-o linker-errors cocos2d-iphone automatic-ref-counting
我尝试在Objective C中编写一个程序来计算一些东西.不幸的是,有很多要计算,并且程序正在运行10000次迭代的循环.总运行时间约为5分钟.这不是问题,但在运行内存时,程序使用的内存会急剧上升(高于2GB),我认为这是因为某些值未发布.我将问题缩小到在循环内创建NSArray.有问题的代码(改为专注于问题)是这样的:
for (NSInteger k = 0; k<100000; k++) {
NSMutableArray *mutableTestArray = [NSMutableArray new];
for (NSInteger i=0; i<200; i++){
NSMutableArray *subArray = [NSMutableArray new];
for (NSInteger j=0; j<200; j++) {
//simplified version, normally the valus for sub array are dependent on some other factors
[subArray addObject:[NSArray arrayWithObjects:@"test", @"test", nil]];
}
[mutableTestArray addObject:subArray];
}
//do stuff with mutableTestArray
//change parameters that go into sub array
}
Run Code Online (Sandbox Code Playgroud)
如果我更换:
[subArray addObject:[NSArray arrayWithObjects:@"test", @"test", nil]];
Run Code Online (Sandbox Code Playgroud)
有:
[subArray addObject:@"test"];
Run Code Online (Sandbox Code Playgroud)
它工作正常.所以我想我不得不释放我创建的数组.但是怎么样?我启用了ARC,据我所知,如果启用了ARC,我无法手动释放对象.如果有人可以帮我改变代码或者提示我可以学习如何正确地进行内存管理,那将会很棒.
谢谢
我在SecItemCopyMatching上发现了内存泄漏.经过对SF的调查,我找到了解决方案:
__block NSString *certificateName = nil;
SecKeychainRef keychain;
SecKeychainCopyDefault(&keychain);
NSMutableDictionary *attributeQuery = [NSMutableDictionary dictionary];
[attributeQuery setObject: (id) kSecClassIdentity forKey:(__bridge_transfer id) kSecClass];
[attributeQuery setObject: (id) kCFBooleanTrue forKey:(__bridge_transfer id) kSecReturnRef];
[attributeQuery setObject: (id) kSecMatchLimitAll forKey:(__bridge_transfer id) kSecMatchLimit];
CFTypeRef attrResult = NULL;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef) attributeQuery,(CFTypeRef *) &attrResult);<------- here is a leak according Instruments
if (status != errSecItemNotFound) {
NSArray *attributeResult = (__bridge_transfer NSArray *)attrResult;
[attributeResult enumerateObjectsUsingBlock:^(id identityFromArray, NSUInteger idx, BOOL *stop) {
OSStatus status;
SecCertificateRef cert = NULL;
status = …Run Code Online (Sandbox Code Playgroud) 我在互联网上搜索过,我发现很多人和我有同样的问题而没有解决方案......
如果我有像NSTimer这样的东西并让它反复循环而我将这段代码粘在其中由于某种原因我得到大量的内存泄漏并且应用程序在大约100个左右循环后崩溃.
但我启用了ARC.
drawInRect根据乐器,记忆问题肯定是胜利.
-(void)nstimerTick {
UIGraphicsBeginImageContextWithOptions(testView.frame.size, NO, 0.0);
[[testView image] drawInRect:testView.bounds];
testView.image = UIGraphicsGetImageFromCurrentImageContext();
}
Run Code Online (Sandbox Code Playgroud) 我现在重读"过渡到ARC发行说明".
一开始,它说
Xcode 4.2支持OS for OS X v10.6和v10.7(64位应用程序)以及iOS 4和iOS 5.OS X v10.6和iOS 4不支持弱引用.
为什么是这样?实施弱引用是否需要深入平台/ OS支持?
我想,弱引用并不那么特别(考虑到C++原始指针的用法).
这可能不是技术原因吗?(弱参考支持被删除,因为它失败了几个测试用例并且没有足够的时间?)
我想测试弧下的属性属性.我NSString在Class1.h(接口文件)下创建了两个属性:
@interface Class1 : NSObject
@property (nonatomic, strong) NSString *str1;
@property (nonatomic, weak) NSString *str2;
@end
Run Code Online (Sandbox Code Playgroud)
然后我在Class1.m(实现文件)下创建了一个测试方法:
@implementation Class1
- (void)testMethod {
NSString *strt1 = @"exampleString1";
NSString *strt2 = @"exampleString2";
self.str1 = strt1;
self.str2 = strt2;
strt1 = nil;
strt2 = nil;
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, QOS_CLASS_BACKGROUND);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), aQueue, ^{
[self testMethod2];
});
}
- (void)testMethod2 {
NSLog(self.str1);
NSLog(self.str2);
}
@end
Run Code Online (Sandbox Code Playgroud)
我在testMethod2方法中设置了一个断点然后检查我的NSString属性.我假设str2设置为nil但是在运行代码后结果是;
2015-07-03 14:14:04.412 ARCTEST …
objective-c ×6
ios ×5
xcode ×3
cgcontextref ×1
cocoa ×1
drawinrect ×1
ios5 ×1
iphone ×1
mach-o ×1
macos ×1
memory ×1
pointers ×1