一些背景 - 我使用Diney的指南构建了一个自定义框架,网址为http://db-in.com/blog/2011/07/universal-framework-iphone-ios-2-0/
它是为armv6/armv7构建的,它是一个基于ARC的框架,编译时的解复目标为4.3.
当我把结果框架放在一个5.0项目中时,它工作得很好,但当我把它放在一个4.3项目(ARC或非弧形,无所谓)时,我得到以下我无法理解的...
我也尝试手动添加libarclite.a,但它没有改变任何东西.
ld:/Users/freak4pc/Project/MyFramework.framework/MyFramework和/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a(arclite.o)中的重复符号_objc_retainedObject,用于架构armv7 Command/Developer /Platforms/iPhoneOS.platform/Developer/usr/bin/clang失败,退出代码为1
非常感谢任何帮助.
谢谢
Shai
我正在使用Xcode 4.2并为iphone构建游戏(来自iOS 3.0 - 5.0).cocos2d支持ARC吗?转换以前版本中编写的代码需要进行哪些修改?
如果我对变量使用强和弱关键字并将编译器设置为LLVM GCC 4.2,结果会是什么?是否有必要将编译器更改为3.0以支持ARC?
我在学习ARC.而现在关于弱指针归零.好的我了解所有功能.弱引用的语义与GC系统的弱引用相同,但是你知道,Objective-C不使用GC(特殊情况除外),所以我无法理解它是如何工作的.
我是一个有点复杂的人,所以我需要知道底层实现原则才能接受要使用的功能.但问题是很难找到描述归零弱指针原理的文档:(
IMO,实现这项工作的唯一方法是跟踪并保持所有指针在运行时引用自身,并nil在其引用计数变为时将它们全部设置0.但这看起来太沉重和愚蠢.我相信在实际的ARC实现中使用了更好的解决方案.
你能帮我找到文件吗?或直接描述会更棒!
我将一些NSOperation代码转换为ARC时遇到了困难.我的操作对象使用完成块,该完成块又包含一个GCD块,用于更新主线程上的UI.因为我从自己的完成块中引用了我的操作对象,所以我使用__weak指针来避免内存泄漏.但是,在我的代码运行时,指针已经设置为nil.
我把它缩小到这个代码示例.谁知道我哪里出错了,以及正确的方法来实现这一目标?
NSOperationSubclass *operation = [[NSOperationSubclass alloc] init];
__weak NSOperationSubclass *weakOperation = operation;
[operation setCompletionBlock:^{
dispatch_async( dispatch_get_main_queue(), ^{
// fails the check
NSAssert( weakOperation != nil, @"pointer is nil" );
...
});
}];
Run Code Online (Sandbox Code Playgroud) objective-c nsoperation grand-central-dispatch objective-c-blocks automatic-ref-counting
(Xcode 4.2,iOS 5,ARC)
我有一些Core Foundation(/ Graphics)对象的属性应该取得对象的所有权.现在在这些Apple文档中我发现了这个:
在OS X v10.6及更高版本中,您可以使用__attribute__关键字指定应将Core Foundation属性视为用于内存管理的Objective-C对象:
@property(retain) __attribute__((NSObject)) CFDictionaryRef myDictionary;
不幸的是我找不到任何详细说明.我正在使用这个:
@property (nonatomic, strong) __attribute__((NSObject)) CGImageRef loupeImage;
它看起来像我期望的那样工作.它保留了设置属性的对象,并在将属性设置为nil时将其释放.
现在我的问题是,我还需要在dealloc中将这些属性显式设置为nil吗?
我在配置为使用ARC的项目中遇到与NSMutableArray链接的内存泄漏,我认为应该为您处理这些事情.
以下代码触发NSNumbers的泄漏:
NSMutableArray *myArray = [[NSMutableArray alloc] init];
NSNumber *myNumber = [NSNumber numberWithFloat:10];
[myArray addObject:myNumber];
Run Code Online (Sandbox Code Playgroud)
运行最后一行在调试器中给出以下内容:
objc [1106]:类__NSCFNumber的对象0x765ffe0自动释放,没有池到位 - 只是泄漏 - 在objc_autoreleaseNoPool()中断以调试
除此之外,对象似乎正确地添加到可变数组中,
我做错了什么吗?
注意:项目中有一个类无法使用ARC,因此我使用编译器标志-fno-objc-arc将其从ARC中排除.但是,泄漏发生在使用ARC的其他类中.不确定这是否相关.
非常感谢您的帮助.
[self.foo setBlock:^{
[self doSomething]; // causes warning
}];
Run Code Online (Sandbox Code Playgroud)
与
[self.foo setBlock:^{
self.bar = baz; // does not cause warning
}];
Run Code Online (Sandbox Code Playgroud)
警告是" self在这个区块中强势捕获可能会导致保留周期."
两者都不会导致强烈的参考?
memory memory-management objective-c ios automatic-ref-counting
我曾经像这样将NSError强制转换为CFErrorRef并在SMJobBless中使用它
NSError *error
BOOL removed = SMJobRemove(kSMDomainSystemLaunchd,
(CFStringRef) daemonBundleID,
auth,
true,
(CFErrorRef*) &error);
if (!removed) {
NSLog(@"Failed to remove existing PacketTool");
[NSApp presentError: error];
}
Run Code Online (Sandbox Code Playgroud)
由于我在ARC中遇到错误,"ARC禁止使用指向'CFErrorRef'的Obj-C指针的间接指针",我改变并决定做相反的事情
CFErrorRef *cfError = nil;
BOOL blessed = SMJobBless(kSMDomainSystemLaunchd, (__bridge CFStringRef)daemonBundleID,
auth,
cfError);
if (!blessed) {
NSError *error = (__bridge NSError *)cfError;
NSLog(@"Failed to bless PacketTool: %@", error);
[NSApp presentError: error];
return FALSE;
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个"不兼容的类型转换'CFErrorRef'到NSError*"与__bridge强制转换
我能做什么?
更新:感谢Greg,正确的代码现在是:
CFErrorRef cfError = nil;
BOOL blessed = SMJobBless(kSMDomainSystemLaunchd,
(__bridge CFStringRef) daemonBundleID,
auth,
&cfError);
if (!blessed) {
NSError *error …Run Code Online (Sandbox Code Playgroud) 这是一种相对常见的设计模式:
它允许您从init调用中返回子类.
我试图找出使用Swift实现相同功能的最佳方法.
我知道有很好的方法可以用Swift实现同样的功能.但是,我的课程将由现有的Obj-C库初始化,我无法控制.因此它需要以这种方式工作并且可以从Obj-C调用.
任何指针都将非常感激.
design-patterns class-cluster ios automatic-ref-counting swift
有NSPointerArray一些NSObject已被释放的弱者.在打电话给compact我看之前是:
(lldb) po [currentArray count]
1
(lldb) po [currentArray pointerAtIndex:0]
<nil>
(lldb) po [currentArray allObjects]
<__NSArrayM 0x16f04f00>(
)
Run Code Online (Sandbox Code Playgroud)
这是有道理的,但真正奇怪的是,当我调用compact该数组时,我看到了相同的值!计数仍然返回1并且pointerAtIndex:0是nil.
为什么没有删除nil?
编辑
这是完整的代码(是的,它是XCTesting框架):
- (void)testCompaction {
__weak id testingPointer = nil;
NSPointerArray *weakArray = [NSPointerArray weakObjectsPointerArray];
@autoreleasepool {
NSObject *someObj = [[NSObject alloc] init];
testingPointer = someObj;
[weakArray addPointer:(__bridge void*)testingPointer];
NSLog(@"before compaction inside autorelease: testingPointer = %@ count = %d, allObjects = %@, pointerAtIndex:0 = %@, pointerAtIndex:0 class = …Run Code Online (Sandbox Code Playgroud)