传递可以更新的变量

时间:2010-06-17 17:00:36

标签: iphone objective-c pointers

这似乎很简单,但无法让它发挥作用。

我将一个变量传递给一个标准属性的UIViewController:

[aViewController setProposedDate:proposedWorkLog.entryDate];

由控制器保留,可能已更改。我已经验证在控制器中,数据已被修改。

但是,在弹出堆栈并查看调用视图后,数据尚未更新。有没有办法传递这个变量并让它保留新值,或者从关闭视图控制器传回响应的方法?

谢谢!

3 个答案:

答案 0 :(得分:3)

如果您尝试修改所有者(entryDate)后面的属性(proposedWorkLog),则可能会出现许多副作用,例如不一致和内存管理不善。

强烈建议采用不同的路线,可以通过proposedWorkLog并为其上的新属性调用setter。

entryDate 看起来就像一个不可变的NSDate,所以你无法改变它;你必须用一个新实例替换它,最好通过调用正确的setter来完成。

答案 1 :(得分:2)

您需要通过引用传递它。 Objective-C中的对象通过引用传递,因为它们(通常)是指针,而另一方面,原语(通常)不是指针。因此,您需要使用address-of运算符(&)传入指向基元的指针。

所以你的代码应该是这样的:

[aViewController setProposedDate:&proposedWorkLog.entryDate];

然后,您需要更改方法原型以获取指向原始类型的指针(例如int *)。

看看使用NSError的错误处理在Objective-C中的工作方式,它在整个地方使用这种方法。 http://www.cimgf.com/2008/04/04/cocoa-tutorial-using-nserror-to-great-effect/

答案 2 :(得分:0)

我非常赞同@Eiko。你应该稍微考虑一下。在C ++中,您可以执行void flipTheseTwo(int* x, int* y)之类的操作,但我很确定这是Objective-C的不良形式(并保留了内存对象)。

这是我的建议。使用@property (assign) MYWorklog worklog; @synthesize worklog = _worklog;

[aViewController setWorklog:proposedWorkLog];
[UINavicationController pushViewController: aViewController animated:YES]; // this syntax might be wrong.  Mac is not near me. :(

...

(IBAction) updateProposedDate:(id)sender
{
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"EEEE MMMM d, YYYY"];
    _worklog.entryDate = [dateFormat dateFromString:[sender stringValue]];  
    [dateFormat release];

}