对象在传递给另一个视图控制器时变为null

时间:2013-04-25 08:34:25

标签: ios objective-c null nsobject

在iOS应用程序中,我需要将一个对象从一个视图控制器传递到另一个视图控制器,然后切换到新的视图控制器。目标是简单地传递信息。但是,对象变为NULL,并且在下一个视图出现时没有任何信息。什么?可能是原因?

以下是我的代码的一部分。

#pragma mark - Table view delegate

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   BIDCourse *course = self.courses[indexPath.row];


   NSString *sub = course.subject;

   BIDSubjectMainTwoViewController *subjectController=[[BIDSubjectMainTwoViewController alloc] init];

   subjectController.title = sub;


   subjectController.course=course;

   [self.navigationController pushViewController:subjectController animated:YES];
}

BIDCourse *courseNSObject的自定义子类,它有一些NSStrings,并且它不是nil,但是当我将它传递给下一个视图控制器时,它变为{{1} }。

5 个答案:

答案 0 :(得分:1)

我遇到了像你这样的问题,当我将一个对象传递给另一个viewController时,它已被释放。

我认为这是ARC的缺陷,ARC认为您的subjectController可能没用,所以它会释放subjectController。将subjectController作为属性,以便在将其传递给另一个viewController时不会释放。

如:

#pragma mark - Table view delegate

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
BIDCourse *course = self.courses[indexPath.row];


NSString *sub = course.subject;

_subjectController=[[BIDSubjectMainTwoViewController alloc] init];

_subjectController.title = sub;


_subjectController.course=course;

[self.navigationController pushViewController:_subjectController animated:YES];
}

答案 1 :(得分:0)

问题出在BIDSubjectMainTwoViewController.m?

subjectController.title = sub;
subjectController.course = course;

BIDSubjectMainTwoViewController.m文件中,您是否@synthesize您的属性?

@synthesize title = _title;
@synthesize course = _course;

您还可以将变量与init函数ala一起传递:

<强> BIDSubjectMainTwoViewController.h

- (id)initWithTitle:(NSString *)title
          andCourse:(BIDCourse *)course;

<强> BIDSubjectMainTwoViewController.m

- (id)initWithTitle:(NSString *)title
          andCourse:(BIDCourse *)course
{
    self = [super init];
    if (self) {
        // Custom initialization
        _title=title;
        _course = course;
    }
    return self;
}

答案 2 :(得分:0)

我遇到了类似的行为。我的解决方案是制作一个对象的副本。对于你的情况:

BIDCourse *course = [self.courses[indexPath.row] copy];

并确保在BIDCourse .m fike中实现copyWithZone。

 -(id)copyWithZone:(NSZone*) zone

答案 3 :(得分:0)

试试这个:

BIDSubjectMainTwoViewController.h

    NSString *strTemp;

    @property(nonatomic,retain) NSString *strTemp;

    -(void) setValuestrTemp : (NSString *) str;

.m文件

    @synthesize strTemp;

//写入setter方法

    -(void) setValuestrTemp : (NSString *) str {
        self.strTemp = str;
    }

并在viewWillAppear中使用strTemp。

//现在使用它

    BIDSubjectMainTwoViewController *subjectController=[[BIDSubjectMainTwoViewController alloc] init];

       [subjectController setValuestrTemp:sub];

    [self.navigationController pushViewController:_subjectController animated:YES];

答案 4 :(得分:0)

使用

   NSString *sub = [course.subject copy];
   subjectController.course=[course copy];

BIDCourse

中实施委托
 -(id)copyWithZone:(NSZone*) zone