我想重写使用ARC的ObjC类中的getter和setter。 .h文件 @property (retain, nonatomic) Season *season; .m文件 @synthesize season; – (void)setSeason:(Season *)s { self.season = s; // do some more stuff } – (Season *)season { return self.season; } 我在这里错过了什么?
我将我的应用程序转换为ARC,并注意到在视图控制器被释放时,在我的一个视图控制器中分配的一个对象没有被解除分配。 花了一段时间才弄明白为什么。 我在debugging过程中为我的项目启用了“僵尸对象”,事实certificate这是事实。 考虑下面的应用程序逻辑: 1)用户调用RootViewController中的动作,使SecondaryViewController被创build并通过presentModalViewController:animated呈现presentModalViewController:animated 。 2) SecondaryViewController包含一个ActionsController ,它是一个NSObject子类。 3) ActionsController在初始化时通过NSNotificationCenter观察一个通知,当它被解除分配时停止观察。 4)用户closuresSecondaryViewController返回到RootViewController 。 启用僵尸对象closures,上述工作正常,所有的对象被释放。 使用ActionsController上的启用僵尸对象不会解除分配,即使SecondaryViewController被释放。 这导致我的应用程序b / c中的问题NSNotificationCenter继续发送通知给ActionsController和结果处理程序导致应用程序崩溃。 我创build了一个简单的应用程序来说明这个在https://github.com/xjones/XJARCTestApp 。 查看与启用僵尸对象控制台日志开/关来validation这一点。 问题(S) 这是启用僵尸对象的正确行为? 我应该如何实现这种types的逻辑来消除这个问题。 我想继续使用启用僵尸对象。 编辑#1:根据凯文的build议,我已经提交给苹果和openradar在http://openradar.appspot.com/10537635 。 编辑#2:澄清一个很好的答案 首先,我是一名经验丰富的iOS开发人员,我完全了解ARC,僵尸对象等。如果我错过了某些东西,当然,我很欣赏任何照明。 其次,对于此特定崩溃的解决方法是,当secondaryViewController被释放时,将observer作为观察者移除。 我也发现,如果我明确地设置actionsController actionsController = nil当secondaryViewController dealloc'ed它将被dealloc'ed。 这两个都不是很好的解决方法B / C他们实际上要求您使用ARC,但代码,如果您不使用ARC(例如显式dealloc中的零iVars)。 一个特定的解决scheme也无助于确定何时这将成为其他控制器中的问题,因此开发人员可以确定何时/如何解决此问题。 一个好的答案可以解释如何确定性地知道在使用ARC + NSZombieEnabled时需要对某个对象做些特殊的事情,这样就可以解决这个具体的例子,并且也可以将整个项目作为一个整体应用,而不用再为其他类似项目问题。 完全有可能没有好的答案,因为这可能是XCode中的一个错误。 感谢所有!
以下是我以前如何编写自定义保留的 setter: – (void)setMyObject:(MyObject *)anObject { [_myObject release], _myObject = nil; _myObject = [anObject retain]; // Other stuff } 当属性设置为强时,如何使用ARC来实现这一点。 我怎样才能确保variables有强大的指针?
我最近下载了Xcode 5,它现在是我的主要IDE。 但是,我现在需要在我的项目中为单个文件禁用自动引用计数。 在Xcode 4中,我进入了我的目标下的Build Phases选项卡,我可以双击Compile Sources部分中一行的右侧,将-fno-objc-arc添加到编译器标志列表中,closures。 然而,在5,列似乎是不可点击的: 那么,我该怎么做呢?
我试图找出一种方法来使用typeof来创build一个self的弱引用在块中使用,以避免保留周期。 当我第一次读到这个时,似乎这个惯例是使用__block typeof(self) bself = self; ,编译但使用__block来避免保留周期不再工作,应该使用__weak 。 然而__weak typeof(self) bself = self; 导致错误: 'typeof(self)'(aka'TUAccountsViewController * const __strong')types已经有保留属性设置 有没有办法使用typeof或其他调用一般创build一个self弱引用?
在这里也有一个类似的问题,但是我只想澄清那些在这里没有完全解释的东西。 我明白,所有代表和出路 – 事实上任何提及“父母”的对象,都是一个好的公民,并思考对象图一分钟 – 应该把弱引用归结为零。 由于归零弱指针的性质会自动降到零,而引用对象的保留计数达到零,这是否意味着将IBOutlets设置为零,现在viewDidUnload现在是不必要的了? 所以,如果我宣布我的出路是这样的: @property (nonatomic, weak) IBOutlet UILabel *myLabel; 下列代码是否有效? – (void)viewDidUnload { self.myLabel = nil; [super viewDidUnload]; }
多年来,我一直在追踪一个名为Target-Action的伟大模式,如下所示: 一个对象在时间到来时调用指定的目标对象上的指定select器。 这在很多不同的情况下非常有用,你需要一个简单的callback方法。 这是一个例子: – (void)itemLoaded { [specifiedReceiver performSelector:specifiedSelector]; } 在ARC之下,现在我们发现这样做突然变得危险了。 Xcode抛出一个警告,如下所示: PerformSelector可能会导致泄漏,因为它的select器是未知的 当然,select器是未知的,因为作为Target-Actiondevise模式的一部分,您可以指定任何您想要的select器,以便在发生有趣的事情时接听电话。 这个警告最让我感到困惑的是它说可能会有潜在的内存泄漏。 根据我的理解,ARC不会弯曲内存pipe理规则,而只是在正确的位置自动插入保留/释放/自动释放消息。 另外需要注意的是:-performSelector:有一个id返回值。 如果该方法返回+1保留计数对象,则ARC通过应用命名约定来分析方法签名。 在这种情况下,ARC不知道select器是否是-newFooBar工厂,或者只是调用一个不可靠的工作者方法(反正Target-Action几乎总是这样)。 其实ARC应该已经认识到我不期望有一个返回值,因此忘记了任何潜在的+1保留计数的返回值。 从这个angular度来看,我可以看到ARC从哪里来,但仍然存在着太多的不确定性,这在实践中意味着什么。 那现在是否意味着在ARC之下会出现什么问题呢? 我不明白这是如何产生内存泄漏的。 有人可以举例说明这样做的危险性,以及在这种情况下如何产生泄漏? 我真的从互联网上下了地狱,但没有find任何网站解释为什么 。
我有一个被保留的东西超过了必要的(很可能是因为一个strong而不weak的属性)。 大的代码库,所以很难find在哪里。 如何在使用ARC时find所有保留这个对象的行? 如果我不使用ARC,我想我可以简单地覆盖retain并检查它从哪里调用。 我可以做与ARC类似的东西吗?
我正在使用AddThis在我的iOS应用程序中添加共享选项。 我已经导入了类,并将-fno-objc-arc标志添加到所有导入的类,因为它们不使用ARC。 但是,当我尝试运行该应用程序时,我得到了一堆parsing问题,例如: Expected identifier or '(' Unknown type name 'NSString' Unknown type name 'Protocol' … 这些错误发生在NSObjCRuntime,NSZone和NSObject。 我也有必要的框架。 有任何想法吗? 包括这个图像,如果有帮助:
我怎样才能得到一个数组零引用下弱引用 ? 我不希望数组保留对象。 而且我希望数组元素可以在释放时自行删除,或者将这些条目设置为nil。 同样的,我怎样才能用字典呢? 我不希望字典保留这些值。 再次,我希望字典元素或者在值被释放时自行移除,或者将值设置为零。 (我需要保留这些唯一标识符的键,至less在取消分配相应的值之前)。 这两个问题包含了类似的理由: 对ARC下的对象的弱引用的NSArray 有一个不保留的id对象列表? 但是也不要求引用归零 。 根据文档,NSPointerArray和NSHashMap都不支持ARC下的弱引用。 NSValue的nonretainedObjectValue也不会工作,因为它是非零。 我看到的唯一的解决scheme是创build我自己的 NSValue类包装类(weak)属性, 这个答案提到,接近尾声 。 有没有更好的方法,我没有看到? 我正在开发OS X 10.7和iOS 6.0。