我发现一些奇怪的问题,但并非所有运行iOS 9.3.5的旧硬件我真的很感激为什么会发生这种情况。我知道我可以解决单身全局问题,但这看起来很难看。
在不好的情况下,通过segue的数据传输不会到达新的视图控制器,而其他旧的硬件运行9.3.5并且所有新的硬件都按预期工作。
简而言之,我有一个使用Master / Detail设计的应用程序,我使用Interface Builder(不是标准模板)构建。主ViewController包含一个UITableView,同时使用STCollapse和MMDrawerSideSlide库。选择表行会生成一个segue,其中prepareForSegue将一些项加载到DetailViewController的属性中。 NSString属性总是正常运行,但是在一些旧硬件中(见下文),所选行的NSIndexPath被正确移动到主VC中prepareForSegue的detail属性中,但是没有到达DetailViewController,属性为NIL时详细信息的viewDidLoad执行。
DetailViewController中的NSIndexPath的硬件和iOS版本的值表
iPad 2 9.3.5 nil
iPad Air 9.3.5 nil
iPad Air2 9.3.5 correct
iPhone 5 9.3.5 nil
iPhone 5s 9.3.5 correct
iPhone 6 9.3.5 correct
all devices 10.x correct
代码段
主ViewController.m
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.selectedIndexPath = indexPath;
[self performSegueWithIdentifier:@"toDetail" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Make sure your segue name in storyboard is the same as this line
if ([[segue identifier] isEqualToString:@"toDetail"])
{
DetailViewController *detailVC = segue.destinationViewController;
detailVC.selectedIndex = self.selectedIndexPath;
detailVC.searchName = _theName;
}
}
DetailViewController.h
@property (nonatomic, weak) NSIndexPath * selectedIndex;
@property (nonatomic, weak)NSString * searchName;
DetailViewController.m
- (void)viewDidLoad { //In new hardware _selectedIndex is OK, in some old hardware, is nil, _searchName is always OK!
[super viewDidLoad];
Kings *flatkings = [Kings sharedKings];
self.flatSequenceNumber = (int)[flatkings getFlatIndexFromTablePath:_selectedIndex];
[self drawTheView];
}
答案 0 :(得分:0)
selectedIndex
和searchName
的终身限定符应为copy
,而不是weak
。两个视图控制器没有理由共享对同一字符串的引用。即使您想要共享引用,也应该使用strong
,而不是weak
,因为没有潜在的保留周期。
Apple的Advanced Memory Management Programming Guide是一个很好的资源,可以更好地了解终身资格赛。