Ale*_*one 4 memory-management objective-c ios ios5 automatic-ref-counting
我有一个使用自动引用计数的类.在课堂上,我有一个如下所述的财产.当我为班级设置提醒时,我希望发生更改按钮标题的副作用.
这是我的代码:
在.h文件中:
@property(nonatomic,strong)Reminder* reminder;
Run Code Online (Sandbox Code Playgroud)
在.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");
}
}
Run Code Online (Sandbox Code Playgroud)
我知道没有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");
}
}
Run Code Online (Sandbox Code Playgroud)
我是否需要在启用ARC的setter方法中执行任何其他操作以确保正确保留强变量?
你不需要为这样的副作用编写自己的setter.使用KVO!
使拥有该按钮的控制器观察该对象的reminder属性:
[reminderOwner addObserver:self
forKeyPath:@"reminder"
options:NSKeyValueObservingOptionNew
context:NULL];
Run Code Online (Sandbox Code Playgroud)
该options参数指定了在观察时您想要传递的被观察对象的状态的信息.
然后,只要此属性更改值,您的控制器就会被通知(请注意,只有在以"符合键值"的方式设置属性时才会发生这种情况,最方便的方法是通过setter方法* - 直接更改ivar不会' t计数).
您需要observeValueForKeyPath:ofObject:change:context:在控制器中实现:
- (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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
哦,并且,呃,回答你的实际问题,我相信你的记忆管理很好.reminder被合成为一个__strong合格的变量,这意味着ARC将保留你放在那里的任何东西.
*这就是为什么你听说不要在init和中使用setter dealloc.