gpt4 book ai didi

objective-c - 使用 ARC,如何正确设置具有副作用的属性?

转载 作者:可可西里 更新时间:2023-11-01 05:38:49 24 4
gpt4 key购买 nike

我有一个使用自动引用计数的类。在类里面,我有一个如下所述的属性。当我为类(class)设置提醒时,我希望发生更改按钮标题的副作用。

这是我的代码:

在.h文件中:

@property(nonatomic,strong)Reminder* reminder;

在 .m 文件中: @synthesize提醒;

  -(void)setReminder:(Reminder *)reminder_
{
//what else do I need to do here?
reminder = reminder_;
if(!reminder.useSound.boolValue)
{
onOffButton.title = NSLocalizedString(@"Off", @"Off title");

}else
{
onOffButton.title = NSLocalizedString(@"On", @"On title");
}
}

我知道如果没有 ARC,我会做这样的事情:

-(void)setReminder:(Reminder *)reminder_

{

[reminder release];
reminder = [reminder_ retain];


if(!reminder.useSound.boolValue)
{
onOffButton.title = NSLocalizedString(@"Off", @"Off title");

}else
{
onOffButton.title = NSLocalizedString(@"On", @"On title");
}
}

我是否需要在启用 ARC 的 setter 方法中执行任何其他操作以确保正确保留强变量?

最佳答案

您不需要为这样的副作用编写自己的 setter。使用 KVO !

让拥有按钮的 Controller 观察这个对象的 reminder 属性:

[reminderOwner addObserver:self
forKeyPath:@"reminder"
options:NSKeyValueObservingOptionNew
context:NULL];

options argument指定在进行观察时您希望传递的有关被观察对象状态的信息。

然后,只要此属性更改值,您的 Controller 就会收到通知(请注意,只有在以“键值兼容”方式设置属性时才会发生这种情况,最方便的方法是通过 setter 方法*——更改 ivar直接不算)。

您需要实现 observeValueForKeyPath:ofObject:change:context:在你的 Controller 中:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
// Distinguish between observations if necessary; you can also
// use the |object| argument for this.
if( [keyPath isEqualToString:@"reminder"] ){
// Update button text with contents of |change| dictionary
Reminder * reminder = [change objectForKey:NSKeyValueChangeNewKey];
if(!reminder.useSound.boolValue)
{
onOffButton.title = NSLocalizedString(@"Off", @"Off title");

}else
{
onOffButton.title = NSLocalizedString(@"On", @"On title");
}
}
}

哦,呃,回答你的实际问题,我相信你的内存管理很好。 reminder 被合成为一个 __strong 限定的变量,这意味着 ARC 将保留您放置在那里的任何内容。


*这就是为什么您听说不要在 initdealloc 中使用 setter 的原因。

关于objective-c - 使用 ARC,如何正确设置具有副作用的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8059689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com