Получите доступ к экземпляру AppDelegate, но ошибка: EXC_BAD_ACCESS - PullRequest
0 голосов
/ 17 марта 2012

Пожалуйста, помогите мне с этим:

В AppDelegate есть аргумент под названием «пользователь»:

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    User *user;
}
@property (nonatomic, retain) User *user;

и я запускаю пользовательский экземпляр в первом контроллере:

User *userInfo = [[User alloc] initWithRealName:realName UserId:userId]; 

и установите для пользователя значение AppDelegate:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.user = userInfo;

Во втором viewController, я могу получить realName использования, нет проблем:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSString *realName = appDelegate.user.realName;

Но когда я нажимаю на другой viewController, и я хочу получить настоящее имя пользователя, как сейчас, но есть ошибка: EXC_BAD_ACCESS:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
User *user  = appDelegate.user;
NSLog(@"I am in noticeDetailViewController:%@",user.realName);***//ERROR***

И я хочу знать, почему? и как исправить эту ошибку.

Спасибо!

User.h & User.m

@interface User : NSObject
{
    NSString *realName;
    NSString *userId;
}

@property (nonatomic, retain)NSString *realName;
@property (nonatomic, retain)NSString *userId;
- (id)initWithRealName   :(NSString *)realNameArgument UserId :(NSString *)userIdArgument;
@end

@implementation User
@synthesize realName,userId;

- (id)initWithRealName   :(NSString *)realNameArgument UserId :(NSString *)userIdArgument 

{
    self = [super init];

    if (self)
    {
        realName = realNameArgument;
        userId   = userIdArgument;       
    }
    return self;
}

- (void)dealloc
{
    [super dealloc];
    [realName release];
    [userId release];
}

@end

1 Ответ

0 голосов
/ 17 марта 2012

AppDelegate не сохраняет user, поэтому он освобождается до того, как вы попытаетесь получить к нему доступ:

NSLog(@"I am in noticeDetailViewController:%@",user.realName);***//ERROR***

Поэтому измените AppDelegate, создав оставшееся свойство:

@interface AppDelegate : UIResponder <UIApplicationDelegate> {
// ...
@property (retain, nonatomic) User*user;
// ..

И не забудьте его синтезировать.

Также измените метод инициализации пользователя на:

- (id)initWithRealName:(NSString *)realNameArgument UserId:(NSString *)userIdArgument
{
    self = [super init];
    if (self) {
        self.realName = realNameArgument;
        self.userId   = userIdArgument;       
    }
    return self;
}
...