2011-10-10 56 views
1

在AppDelegate中我有一个用户变量,以便在整个应用程序中都可以访问。 THA的AppDelegate代码如下:AppDelegate实例变量获取僵尸

@interface MyAppDelegate : NSObject <UIApplicationDelegate, ...> { 

@private User *_appUser; 
... 
} 

- (void)setUser:(User *)value; 
- (User *)appUser; 

- (void)setUser:(User *)value 
{ 
    @synchronized(self) 
    { 
    if(_appUser != value) 
    { 
     [_appUser release]; 
     _appUser = [value retain]; 
     [NSUserDefaultsManager SaveUser:_appUser]; 
    } 
} 

}

- (User *)appUser 
{ 
    if(_appUser == nil) 
    return [NSUserDefaultsManager GetUser]; 
else 
    return _appUser; 
} 

第一次,当用户寄存器,I设置经由的ViewController用户通过执行

[((MyAppDelegate *)[[UIApplication sharedApplication] delegate]) setUser:user]; 

事情是当我需要通过做

User *user = [((MyAppDelegate *)[[UIApplication sharedApplication] delegate]) appUser]; 

在AppDelegate的AppUser方法中,_appUser ivar是僵尸。 任何解决方法? 预先感谢您。

回答

0

你的getter方法是罪魁祸首吗?您正在返回_appUser而没有通常的保留/自动释放模式。您可以通过您的getter方法来解决这个问题:

- (User *)appUser 
{ 
    if(_appUser == nil) 
    return [NSUserDefaultsManager GetUser]; 
else 
    return [[_appUser retain] autorelease]; 
} 

或...

- (User *)appUser 
{ 
    if(_appUser == nil) 
     _appUser = [[NSUserDefaultsManager GetUser] retain]; 
    return [[_appUser retain] autorelease]; 
} 
+0

这似乎并没有帮助的。 _appUser在这种方法中仍然是僵尸。我在应用程序didFinishLaunchingWithOptions中添加了_appUser = [[[User alloc] init] retain],但无济于事。 – ozzotto

+0

您是否直接在应用程序委托的其他位置访问_appUser ivar,而不是通过访问器?此外,我不知道什么样的对象(和什么保留计数),[NSUserDefaultsManager GetUser]方法正在返回... – FluffulousChimp

+0

GetUser方法使用NSKeyedUnarchiver unarchiveObjectWithData,所以我想返回一个自动释放对象。另外,在setter方法中,'value'是一个自动释放对象。 – ozzotto