【问题标题】:How to share state between viewControllers using the AppDelegate object如何使用 AppDelegate 对象在 viewController 之间共享状态
【发布时间】:2010-12-24 17:42:28
【问题描述】:

我试图在几个不同的视图控制器之间共享一个 NSArray 对象,我的第一个想法是在应用程序委托上添加一个属性,因为它们都可以访问这个对象。

但经过一些调试后,由于某种原因,我似乎实际上无法共享此数组。当我从第一个视图控制器和 NSLog 设置对象时,结果一切都很好。但是当我尝试使用另一个视图控制器对象获取该数组值时,它总是返回 UITouchData(不是我的第一个视图控制器设置值后日志中先前显示的值)

这是我用来设置值的代码

NSArray* cookies = [NSHTTPCookie 
                    cookiesWithResponseHeaderFields:[response allHeaderFields] 
                    forURL:[NSURL URLWithString:@""]];

  [appDelegate setAuthCookie:cookies];

这是我的应用委托的 .h 的一部分

@interface SomeAppDelegate : NSObject <UIApplicationDelegate> {
  NSArray* authCookie;
}

@property (retain) NSArray* authCookie;

- (void)setAuthCookie:(NSArray *)cookie;
- (NSArray *)getAuthCookie;

@end

这里是相关方法的 .m

@synthesize authCookie;

- (void)setAuthCookie:(NSArray *)cookie
{
  authCookie = cookie;  
}

- (NSArray *)getAuthCookie
{
  return authCookie;
}

这是在失败的第二个视图控制器中获取此数组的尝试(从技术上讲,它不会在这条线上失败,但我没有按预期返回 NSArray,所以当我尝试使用它时它失败了)

NSArray* cookies = [appDelegate getAuthCookie];

有什么方法可以像这样使用应用委托来共享状态?

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    您的内存管理错误,当您稍后使用 getter 时,您将获得一个完全不同的对象,该对象继承了旧数组的地址。

    您的@property 是正确的,但是您编写了自己的不保留对象的setter 和getter。您不需要同时使用@property/@synthesize 并提供您自己的getter/setter。前者是自动化后者的新方法。

    如果您删除 setAuthCookier: 和 getAuthCookie 的实现,那么您的代码应该可以工作。

    【讨论】:

    • 我最初实际上尝试过,但是当我尝试直接设置或从属性获取时,它总是会爆炸(即 - [appDelegate authCookie:cookies];) - 我应该如何执行此修改后的获取/设置你提到了?语法似乎与我预期的不同(谢谢你的回答!)
    • 只使用@property/@synthesize,但setter 仍将被称为setAuthCookie:,而不是authCookie:。 'set' 是由正常的 Objective-C 约定所暗示的。然后,getter 将只是 [appDelegate authCookie]。或者,使用 Objective-C 点语法 - 'appDelegate.authCookie = cookies' 来设置和 'something = appDelegate.authCookie' 来获取。
    • 太棒了!你刚刚救了我 2 天的捶打课程(谢谢谢谢谢谢)!!!
    猜你喜欢
    • 2019-12-10
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多