0

我是 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;
4

2 回答 2

2

如果您需要保留项目,则应使其成为强大的属性。

于 2012-12-04T15:46:08.533 回答
0

亚当是正确的。您的 item 属性需要很强大,否则它会在您发布的代码运行完毕后立即发布。

如果还没有,您还需要使 Item 对象的“title”属性变得强大。

您需要阅读对象所有权。

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

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

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

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

最后,在 LocateItemController 的 dealloc 方法中,您需要添加以下行:

self.item = nil;

这将导致您的 LocateItemController 的项目对象在 LocateItemController 被释放之前被释放。

于 2012-12-04T16:10:59.753 回答