标签: automatic-ref-counting

引用嵌套块内的弱自我

假设我已经创建了一个弱自我使用

__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
        ...
}];
Run Code Online (Sandbox Code Playgroud)

在该块内,如果我嵌套另一个块:

[weakSelf doAnotherBlockOperation:^{
    [weakSelf doSomething];
}
Run Code Online (Sandbox Code Playgroud)

它会创建一个保留周期吗?我是否需要为weakSelf创建另一个弱引用?

__weak typeof(self) weakerSelf = weakSelf;
[weakSelf doAnotherBlockOperation:^{
    [weakerSelf doSomething];
}
Run Code Online (Sandbox Code Playgroud)

memory-management block ios automatic-ref-counting retain-cycle

40
推荐指数
2
解决办法
4万
查看次数

在自动引用计数下,为什么不允许保留,释放和释放?

当尝试使用-retain,-release-dealloc在使用Xcode 4.2中的自动引用计数构建我的应用程序时,我收到如下错误:

自动引用计数禁止'dealloc'的显式消息发送

为什么我看到这个错误?在自动引用计数下是否-retain,-release并且-dealloc不再允许这样做?

objective-c automatic-ref-counting

39
推荐指数
1
解决办法
3万
查看次数

ARC之后我应该使用什么属性用于Dispatch Queue?

我使用我的视图控制器将调度队列维护为属性.我在视图控制器的init方法中创建了一次此队列,并重复使用了几次后台任务.在ARC之前,我这样做:

@property (nonatomic, assign) dispatch_queue_t filterMainQueue;
Run Code Online (Sandbox Code Playgroud)

在init中:

if (filterMainQueue == nil) {
     filterMainQueue = dispatch_queue_create("com.myQueue.CJFilterMainQueue", NULL);
}
Run Code Online (Sandbox Code Playgroud)

但是在ARC之后,我不确定这应该仍然是"分配",还是应该是"强"还是"弱".ARC转换器脚本没有改变任何东西,但我不确定一个微妙的错误是否来自这个队列在被使用时可能被解除分配的事实?

使用ARC时,3种类型的属性和调度队列最适合的是什么?

objective-c grand-central-dispatch automatic-ref-counting

39
推荐指数
3
解决办法
2万
查看次数

ios - NSObjCRuntime,NSZone和NSObject中的解析问题

我正在使用AddThis在我的iOS应用中添加共享选项.

我已导入类并将-fno-objc-arc标志添加到所有导入的类中,因为它们不使用ARC.

但是,当我尝试运行应用程序时,我得到了大量的解析问题,例如:

Expected identifier or '('
Unknown type name 'NSString'
Unknown type name 'Protocol'
...
Run Code Online (Sandbox Code Playgroud)

这些错误发生在NSObjCRuntime,NSZone和NSObject中.我也包含必要的框架.有任何想法吗?

如果有帮助,请包括此图片: 图片

compiler-errors addthis ios automatic-ref-counting

39
推荐指数
4
解决办法
2万
查看次数

我需要在ARC中使用dealloc方法吗?

所以,我上课了:

@interface Controller : NSObject
{
    UILabel* fileDescription;
}

@property(strong, nonatomic) UILabel* fileDescription;
Run Code Online (Sandbox Code Playgroud)

我是否需要使用方法dealloc,其中属性fileDescription将等于nil?
例如:

-(void)dealloc
{
    fileDescription = nil;
}
Run Code Online (Sandbox Code Playgroud)

如果没有,谁将解雇f​​ileDescription使用的内存?

iphone objective-c ios automatic-ref-counting

39
推荐指数
3
解决办法
2万
查看次数

没有在ARC应用程序上调用Dealloc

我有一个UIViewController被推到容器控制器然后弹出,并使用分配工具,我可以看到视图控制器后来被销毁.但是,从未达到控制器dealloc中的断点.有谁知道为什么没有调用dealloc?ARC可以在不调用dealloc的情况下销毁对象吗?

此外,我已经禁用了NSZombies(有些人说可以导致dealloc不能开火).

编辑:

Dealloc没有做太多,只是打印到控制台,它永远不会被调用:

- (void)dealloc { NSLog(@"Deallocating..."); }

我不能发布容器控制器 - 它是专有的,太复杂了.Dealloc在某些控制器上持续调用,而不是其他控制器.如果我能找到时间,我会尝试发布一个简化版本来重现问题.

有没有办法验证NSZombies是否被禁用?

EDIT2

我正在发布仪器截图; 它看起来像是正确的解除分配.

在此输入图像描述

ios ios5 automatic-ref-counting

38
推荐指数
7
解决办法
3万
查看次数

ARC下的IBOutlet和viewDidUnload

还有一个类似的问题这对SO 在这里,但我只是想澄清的东西,并没有完全解释存在.

据我所知,所有代表和出口 - 事实上任何对"父"对象的引用,作为一个好公民,并考虑一分钟的对象图 - 应该归结为弱引用.由于零指针的性质在引用对象的保留计数达到零时自动降至零,这是否意味着现在将IBOutlets设置为nil viewDidUnload是不必要的?

所以,如果我这样宣布我的出口:

@property (nonatomic, weak) IBOutlet UILabel *myLabel;
Run Code Online (Sandbox Code Playgroud)

以下代码是否有效?

- (void)viewDidUnload
{
    self.myLabel = nil;

    [super viewDidUnload];
}
Run Code Online (Sandbox Code Playgroud)

weak-references iboutlet ios automatic-ref-counting

36
推荐指数
3
解决办法
7076
查看次数

查找ARC保留对象的位置

我有一个对象被保留超过必要(很可能是由于一个属性strong而不是weak).大代码库,所以很难找到哪里.

使用ARC时,如何找到保留此对象的所有行?

如果我没有使用ARC,我想我可以简单地覆盖retain并检查它的调用位置.我可以用ARC做类似的事吗?

macos xcode ios automatic-ref-counting

36
推荐指数
4
解决办法
2万
查看次数

NSError和__autoreleasing

有人可以__autoreleasing在下面的示例代码块中向我解释一下目的吗?

- (void)execute:(NSError * __autoreleasing *)error {
    // do stuff, possibly assigning error if something went wrong
}
Run Code Online (Sandbox Code Playgroud)

我删除了__autoreleasing所有东西似乎仍然编译/运行正常.我开始使用obj-c后ARC,所以我从来没有真正学过/理解所有那些双下划线的东西.我已阅读ARC过渡指南,但我不完全了解他们的NSError示例.

objective-c automatic-ref-counting

36
推荐指数
1
解决办法
2万
查看次数

使用ARC + NSZombieEnabled时,为什么对象没有被释放

我将我的应用程序转换为ARC,并注意到在我的一个视图控制器中分配的对象在该视图控制器被解除分配时没有被解除分配.花了一段时间才弄清楚原因.我在调试时为我的项目启用了Zombie Objects,结果证明这是原因.考虑以下应用程序逻辑:

1)用户调用动作RootViewController,导致a SecondaryViewController通过创建和呈现presentModalViewController:animated.

2)SecondaryViewController包含ActionsController一个NSObject子类.

3)ActionsController通过NSNotificationCenter初始化时观察通知,并在取消分配时停止观察.

4)用户解雇SecondaryViewController返回RootViewController.

关闭"启用僵尸对象",上面的工作正常,所有对象都被取消分配.启用Zombie Objects on ActionsController即使SecondaryViewController已取消分配,也不会取消分配.

这导致我的应用程序中的问题b/c NSNotificationCenter继续向其发送通知,ActionsController并且生成的处理程序导致应用程序崩溃.

我创建了一个简单的应用程序,在https://github.com/xjones/XJARCTestApp上说明了这一点.查看控制台日志,启用/启用"启用僵尸对象"以验证这一点.

问题(S)

  1. 这是启用僵尸对象的正确行为吗?
  2. 我应该如何实现这种类型的逻辑来消除这个问题.我想继续使用Enable Zombie Objects.

编辑#1:根据凯文的建议,我已经将其提交给Apple和openradar,网址为http://openradar.appspot.com/10537635.

编辑#2:澄清一个好的答案

首先,我是一位经验丰富的iOS开发人员,我完全理解ARC,僵尸对象等.如果我遗漏了某些东西,当然,我很欣赏任何照明.

其次,这种特定崩溃的解决方法是actionsControllersecondaryViewController解除分配时作为观察者删除.我还发现如果我明确设置actionsController = nil什么时候secondaryViewControllerdealloc'ed它将被dealloc'ed.这两个都不是很好的解决方法b/c它们实际上要求你使用ARC但是代码好像你没有使用ARC(例如在dealloc中明确地使用nil iVars).特定的解决方案也无法确定何时这会成为其他控制器中的问题,因此开发人员确定地知道何时/如何解决此问题.

一个好的答案将解释如何确定性地知道你需要在使用ARC + NSZombieEnabled时对某个对象做一些特殊的事情,这样它就可以解决这个具体的例子并且通常也适用于整个项目而不会留下其他类似的潜力问题.

完全有可能没有好的答案,因为这可能是XCode中的一个错误.

谢谢大家!

iphone ios nszombieenabled automatic-ref-counting

35
推荐指数
3
解决办法
8951
查看次数