财产不保留(ARC)

时间:2012-08-27 19:12:39

标签: objective-c properties delegates automatic-ref-counting protocols

我有一个模态视图控制器,以表格样式显示。它有一个委托协议。我正在实现该协议并在演示之前分配一个委托,但即使该属性很强,它也会丢失。欢迎任何可能的原因。谢谢!

这是属性声明,强大。

@protocol SDStoreViewDelegate <NSObject>
// Methods
@end

@interface SDStoreViewController : UIViewController

@property (strong, nonatomic) id <SDStoreViewDelegate> delegate;

@end

这是创建对象和委托集的地方。

SDStoreViewController *store = [[SDStoreViewController alloc] init];
[store setDelegate:self];

NSLog(@"1 %@",store.delegate); // Returns Object as expected

[self presentViewController:store animated:YES completion:^{
    NSLog(@"3 %@",store.delegate); // Returns Object as expected
}];

NSLog(@"4 %@",store.delegate); // Returns Object as expected

这是SDStoreViewController的viewDidLoad。它已经失去了它的代表

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"3 %@",_delegate); //  Returns NULL
}

这是解雇,因为委托将被调用,它不是NULL。

- (void)dismiss:(id)sender
{
    NSLog(@"5 %@",_delegate); // Returns NULL

    [self.delegate aMethod];
}

更新

我使用了weakstrong个引用。我还使用了self.delegate_delegate来访问该属性。而且,作为一个观点,aMethod回调没有通过哪个促使这个侦探工作找到它丢失的地方。

2 个答案:

答案 0 :(得分:2)

首先,delegate属性必须始终 weakunsafe_unretained否则ARC无法解除具有每个强指针的类其他

@property (weak, nonatomic) id <SDStoreViewDelegate> delegate;

@property (unsafe_unretained, nonatomic) id <SDStoreViewDelegate> delegate;

为什么你没有尝试通过吸气剂到达delegate财产?像这样:

NSLog(@"4 %@",self.delegate);

而不是

NSLog(@"4 %@",_delegate);

还有一个额外的问题:你的方法在那条线上被召回了吗?

[self.delegate aMethod];

如果答案是肯定的,那么您没有丢失delegate,如果答案是否定的,那么您在哪里设置了delegate

答案 1 :(得分:0)

为实现文件添加set和get方法。就在合成函数旁边。

@synthesize delegate = _delegate;
- (id)delegate{
    return _delegate; // Add a breakpoint here
}
- (void) setDelegate:(id) delegate {
    if (_delegate != delegate){
        _delegate = delegate; // Add a breakpoint here
    }
}

还在initWithCoder:方法中放置一个断点,看看它是否正确进入那里。