Tag: 自动ref counting

与ARC的@属性定义:强或保留?

使用Xcode 4.2和ARC,我注意到NSManagedObject的自动生成的代码仍然读取像这样的属性: @property (nonatomic, retain) NSString * someString; 1)现在不应该retain weak吗? 2)为什么自动生成的代码仍然使用retain 3)什么是在这个财产声明retain正确的替代? 我目前正在使用NSFetchRequestdebugging一个问题,我认为这可能是问题的根源。 思考?

Objective-C自动引用计数和垃圾收集有什么区别?

在Xcode 4.2中引入新的自动引用计数(ARC)后,我们不再需要在Objective-C中手动pipe理保留/释放。 这看起来很像垃圾收集,就像Mac上的Objective-C和其他语言一样。 ARC与垃圾收集有何不同?

AutoLayout:removeFromSuperview / removeConstraints抛出exception,并崩溃困难

我们有select地使用自动布局约束,主要是将标签与可编辑的字段元素(通常是UITextView,UITextField)相关联。 但是,自从实现这些字段的自动布局以来,我们看到了一个令人讨厌的exception,并且在卸载视图,释放等时崩溃。exception正在发生,因为它在卸载之前试图从视图中除去约束。 我们的视图/控制器层次结构是这样的: UITableViewController (plain style, but with cell appearance to mimic grouped style) –> UITableViewCell —-> UIViewController (container for editable form) ——> UICollectionViewController (editable form) ——–> UICollectionViewCell ———–> UIViewController (editable field) ————–> UILabel (field label) **HAS CONSTRAINTS** ————–> UITextView / UITextField (field value) **HAS CONSTRAINTS** 很多时候,当上层表格单元被释放/replace/重新加载时,我们看到一个巨大的exception,然后崩溃,因为它试图释放/卸载内部的视图层次结构。 我试图通过捕获exception(无帮助)来缓解崩溃,并且在释放/卸载( viewWillDisappear:之前强制删除受影响的视图和所有子视图上的所有约束,帮助。 我甚至试图逐个删除这些约束,看是否有一个特别的问题导致了麻烦,但是当我们调用removeConstraint:或者removeConstraints:在一个容器上准备消失时,所有这些约束都炸毁了。 我很困惑! 这是我们例外的一小部分 – 大约有大约3000条线已经被切掉,所以如果你需要更多的话,请问。 Exception […]

弱NSStringvariables不是零后设置唯一强引用为零

我有这个代码的问题: __strong NSString *yourString = @"Your String"; __weak NSString *myString = yourString; yourString = nil; __unsafe_unretained NSString *theirString = myString; NSLog(@"%p %@", yourString, yourString); NSLog(@"%p %@", myString, myString); NSLog(@"%p %@", theirString, theirString); 我期待所有的指针在这个时候是nil ,但他们不是,我不明白为什么。 第一个(强)指针是nil但其他两个不是。 这是为什么?

定制dealloc和ARC(Objective-C)

在我的小iPad应用程序中,我有一个使用观察者的“切换语言”function。 每个视图控制器在其viewDidLoad:注册自己的观察者viewDidLoad: 。 – (void)viewDidLoad { [super viewDidLoad]; [observer registerObject:self]; } 当用户点击“更改语言”button时,新语言被存储在我的模型中,观察者被通知并且在其注册对象上调用updateUi:select器。 这工作得很好,除了当我在TabBarController视图控制器。 这是因为当标签栏加载时,它从它的子控制器中提取标签图标而不初始化视图,所以viewDidLoad:不被调用,所以这些视图控制器不会收到语言改变通知。 因此,我将registerObject:调用移动到init方法中。 当我使用viewDidLoad:回到我的观察者注册,我使用viewDidUnload:注销。 因为我现在正在init注册,所以在dealloc取消注册非常有意义。 但是,这是我的问题。 当我写: – (void) dealloc { [observer unregisterObject:self]; [super dealloc]; } 我得到这个错误: ARC禁止“dealloc”的显式消息发送 因为我需要调用[super dealloc]来确保超类正确地清理,但是ARC禁止,我现在被卡住了。 有什么方法可以在我的物体快要死的时候得到通知?

我应该在ARC的init方法中引用self.property吗?

一个简单的问题。 如果我有一个财产和一个同名的伊娃: 在.h文件中: (Reminder*)reminder; @property(nonatomic,strong)(Reminder*)reminder; 在.m文件中,如果我正在使用ARC,应该在init方法中使用ivar还是属性? – (id)initWithReminder:(Reminder*)reminder_ { self = [super init]; if (self) { reminder = reminder_; } return self; } 或者,我应该使用该属性来获得像这样的自动引用计数的好处: – (id)initWithReminder:(Reminder*)reminder_ { self = [super init]; if (self) { self.reminder = reminder_; } return self; } 我不确定在对象初始化的哪一点,属性可以用点符号来访问。

ARC和桥接投

使用ARC,我不能再将CGColorRef为id 。 我了解到,我需要做一个桥梁演员。 按照clang文档 : 桥接的演员阵容是一个C风格演员,用三个关键字之一进行注释: (__bridge T) op将操作数转换为目标typesT 如果T是可保留的对象指针types,则op必须具有不可保留的指针types。 如果T是一个不可保留的指针types,那么op必须有一个可保留的对象指针types。 否则,演员阵容不健全。 没有所有权转让,并且ARC不插入保留操作。 (__bridge_retained T) op将必须具有可保留对象指针types的操作数强制转换为目标types,该目标types必须是不可保留的指针types。 ARC会保留这个值,但是必须遵守本地值的通常优化,接收者负责平衡+1。 (__bridge_transfer T) op将必须具有不可保留的指针types的操作数强制转换为目标types,该types必须是可保留的对象指针types。 ARC将在封闭的完整expression式的末尾释放该值,受当地值的通常优化。 这些转换是为了传送对象进出ARC控制所必需的; 请参阅保留对象指针转换一节中的基本原理。 使用纯粹的__bridge_retained或__bridge_transfer为分别发出不平衡的保留或释放,是不好的forms。 我会在哪种情况下使用? 例如, CAGradientLayer有一个colors属性,它接受一个CGColorRef数组。 我的猜测是我应该在这里使用__brige ,但是为什么我应该(或者不应该)不清楚。

有关iOS5 SDK中自动引用计数的一些问题

我目前正在为iPad开发一个应用程序。 iOS 4.2的开发工作已经开始,现在iOS 4.3仍在继续(我认为将会完成)。 我刚刚在iOS 5中阅读了关于ARC的内容,基本上我明白我们将永远不需要释放和保留对象了。 我的问题是: 如果我决定升级到iOS 5,是否需要从我的代码中删除所有[myObject retain]和[myObject release]语句? 如果我使用ARC开发iOS 5的新应用程序,我是否需要实施某种“复古兼容性”检查? 即:我是否需要检查iOS的版本,并相应地调用retain和release? 那么,基本上,ARC是可用于所有iOS版本还是仅适用于iOS 5?

处理ARC中的指针指针所有权问题

假设对象A有一个属性: @property (nonatomic, strong) Foo * bar; 在实现中合成为: @synthesize bar = _bar; 对象B操纵一个Foo ** ,就像这个例子中来自对象A的调用: Foo * temp = self.bar; [objB doSomething:&temp]; self.bar = temp; 这个,或者类似的东西,可以合法地完成吗? 什么是doSomething:方法的正确声明? 此外,假设对象B可能会在我有机会设置bar属性之前解除分配(并因此承担temp指向的实例的所有权),那么我将如何告诉ARC交出拥有的引用? 换句话说,如果我想要下面的示例代码片段工作,我将如何处理ARC问题? Foo * temp = self.bar; // Give it a reference to some current value [objB doSomething:&temp]; // Let it modify the reference self.bar = nil; // […]

禁用某些文件的自动引用计数

我已经下载了iOS 5 SDK,发现ARC是新的Apple编译器的一个很棒的function。 目前,许多第三方框架不支持ARC。 我可以使用ARC作为我的新代码,并保持当前的保留/释放代码不变吗? ARC转换器在这里不起作用,因为一些框架,比如JSONKit,不能通过转换器转换成ARC。 编辑: 答案是将-fno-objc-arc添加到不想要ARC的文件的编译器标志。 在Xcode 4中,您可以在您的目标 – > Build Phases – > Compile Sources下执行此操作。