Управление памятью iPhone, EXC_BAD_ACCESS NSString между представлениями - PullRequest
0 голосов
/ 13 октября 2011

У меня есть некоторые проблемы с управлением памятью, я думаю, что моя проблема - это назначение и освобождение объекта. Я хочу назначить значение NSString (userID) другому NSString в другом представлении (user_id).

MainViewController.h

#import "OnlineCheckViewController.h"

@interface MainViewController : UIViewController
{
    NSString *userID;
}
@end

MainViewController.m

#import "MainViewController.h"

- (IBAction)OnlineCheck:(id)sender
{
    OnlineCheckViewController *controller = [[OnlineCheckViewController alloc] initWithNibName:@"OnlineCheckViewController" bundle:nil];
    controller.delegate = self;

    controller.user_id = userID;

    controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self presentModalViewController:controller animated:YES];

    [controller release];
}
- (void)viewDidUnload
{
    userID = nil;
    [super viewDidUnload];
}

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

OnlineCheckViewController.h

#import <UIKit/UIKit.h>
#import "OnlineCheckResultsViewController.h"

@protocol OnlineCheckViewControllerDelegate;

@interface OnlineCheckViewController : UIViewController 
     <OnlineCheckResultsViewControllerDelegate>
{
    NSString *user_id;
}

@property (nonatomic, assign) id <OnlineCheckViewControllerDelegate> delegate;
@property (nonatomic, retain) NSString *user_id;

@end

OnlineCheckViewController.m

#import "OnlineCheckViewController.h"

@synthesize user_id;
@synthesize delegate=_delegate;

- (void)dealloc
{
    [user_id release];
    [super dealloc];
}
- (void)viewDidUnload
{
    [self setUser_id:nil];
    [super viewDidUnload];
}

Спасибо!

Ответы [ 3 ]

0 голосов
/ 13 октября 2011

Попробуйте этот код

- (IBAction)OnlineCheck:(id)sender
{
    OnlineCheckViewController *controller = [[OnlineCheckViewController alloc] initWithNibName:@"OnlineCheckViewController" bundle:nil];
    controller.delegate = self;

    controller.user_id = userID;
    [controller.user_id retain];
    controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self presentModalViewController:controller animated:YES];

    [controller release];
}

Я думаю, что это может решить вашу проблему ...

0 голосов
/ 15 октября 2011

Спасибо за все ваши ответы.

Я решил эту проблему.

В MainViewController.h

Я добавил ИД пользователя IBOutlet

@property (nonatomic, retain) IBOutlet NSString *userID;

In MainViewController.m

@synthesize userID;

- (IBAction)OnlineCheck:(id)sender
{
controller.user_id = self.userID;
}

- (void)viewDidUnload
{
self.userID = nil;
}

- (void)dealloc
{
[userID release];
}

In OnlineCheckViewController.h

Изменено назначение

@property (nonatomic, assign) NSString *user_id;

В OnlineCheckViewController.m

- (void)dealloc
{
// removed
// [user_id release];
}

- (void)viewDidUnload
{
// removed
// [self setUser_id:nil];
}
0 голосов
/ 13 октября 2011
@interface MainViewController : UIViewController
{
    NSString *userID;
}

Готов поспорить, что это ваша проблема.Обратите внимание, что при создании свойства «user_id» вы указываете «сохранить».Retain гарантирует, что процессор не освободит строку, пока вы не скажете это.

NSString автоматически устанавливается на автоматическое освобождение.Если вы планируете сохранить значение в не свойстве NSString (userID), вам нужно вызвать [userID retain];после того, как вы установите его значение.

Я предполагаю, что вы никогда не сохраняли userID, и когда вы пытаетесь установить для него user_id, он вызывает ошибку или , более вероятно, он выдаетошибка, потому что вы отпускаете его в dealloc.

...