执行NSLog后,值将传递到下一个屏幕

时间:2012-12-04 15:39:09

标签: objective-c ios ios6 segue

我是Objective C的新手。我正在做的是在prepeareSegue中为目标视图控制器设置一些值。奇怪的是,如果我在函数中注释掉NSLog,那么值不会被赋值给目标控制器的属性。

我的代码是:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

   if ([segue.identifier isEqualToString:@"ShowItemOnMap"] ) {
       LocateItemViewController *lic = [segue destinationViewController];
       NSIndexPath *index = [self.tableView indexPathForSelectedRow];

       // self.itemsToBuy is a array of NSDictionary
       NSDictionary *selectedItem = [self.itemsToBuy objectAtIndex:[index row]];
       Item *theItem = [[Item alloc] init];
       NSString *theTitle = [[NSString alloc] initWithString:[selectedItem valueForKey:@"title"]];
       theItem.title = theTitle;
       lic.item = theItem;

       // commenting out NSLog make self.irem in LocateItemViewController nil
       // and no value is shown at screen
       NSLog(@"%@", lic.item.title);
   }

}

Item是具有属性

的自定义类
@property (strong, nonatomic) NSString *title;

LocateItemController具有以下属性

@property (weak, nonatomic) Item *item;
@property (strong, nonatomic) IBOutlet UILabel *titleLabel;

和viewDidLoad只是分配项目

self.titleLabel.text = self.item.title;

2 个答案:

答案 0 :(得分:2)

如果您需要保留项目,您应该使其成为一个强大的财产。

答案 1 :(得分:0)

亚当是对的。您的商品属性需要很强,或者一旦您发布的代码完成运行,它就会立即发布。

如果你还没有,你还需要强调你的Item对象的“title”属性。

您需要阅读对象所有权。

交易是这样的:系统跟踪有多少对象具有对对象的强引用。当该计数降至零时,该对象被释放。

默认情况下,局部变量很强。当您创建“theItem”局部变量时,它很强大,并且仅存在于prepareForSegue方法的范围内。当该方法结束时,变量theItem超出范围,并且对Item对象的强引用消失。

您使LocateItemController的item属性变弱。这意味着您的LocateItemController不会获得分配给它的项属性的项目对象的所有权。

如果将LocateItemController中的item属性声明更改为strong,那么当您将Item对象分配给该属性时,LocateItemController将获取该项的所有权。

最后,在你的LocateItemController的dealloc方法中,你需要添加这一行:

self.item = nil;

这将导致LocateItemController的item对象在释放LocateItemController之前被释放。