我试图了解虚拟机监视器(VMM)如何虚拟化CPU.
我现在的理解是,当CPU处于用户模式时,即将执行特权指令时,CPU会发出保护错误中断.在像C这样的高级语言中,特权指令包含在系统调用中.例如,当应用程序需要当前日期和时间(与I/O设备交互的指令具有特权)时,它会调用某个库函数.此库函数的汇编版本包含一个名为"int"的指令,该指令会在CPU中生成陷阱.CPU从用户模式切换到特权模式,并跳转到操作系统提供的陷阱处理程序.每个系统调用都有自己的陷阱处理程序.在此示例中,陷阱处理程序从硬件时钟读取日期和时间并返回,然后CPU将自身从特权模式切换到用户模式.(来源:http://elvis.rowan.edu/~hartley/Courses/OperatingSystems/Handouts/030Syscalls.html)
但是,我不太确定这种理解是否正确.本文提到的(特权)的x86指令POPF不会导致陷阱的概念,从而为VMM复杂的事情:http://www.csd.uwo.ca/courses/CS843a/papers/intro-vm.pdf.根据我的理解,当用户程序显式调用而不是通过系统调用时,popf指令不应该导致陷阱,而应该导致保护错误中断.
所以我的两个具体问题是:
我有两个视图:A和B. A位于屏幕顶部,B位于屏幕底部.
当用户按下按钮时,视图B使用EaseInEaseOut贝塞尔曲线向上动画,直到达到y = 0.当B到达目的地时,它应该在A到达A时向上推A.换句话说,当B有在从底部到顶部的过渡期间传递了一个y坐标(A的y原点+高度),A应该粘在B上,所以看起来B向上推A.
到目前为止我尝试了什么:
关于我接下来可以尝试什么的任何建议?
我有一个UICollectionView显示来自的内容NSFetchedResultsController.collectionView有一个部分,在该部分中有一个标题.标头允许用户过滤集合视图中的内容.标题视图的委托连接到UIViewController包含集合视图.
一旦用户更改其中一个过滤器选项,标题视图就会向其委托发出消息.委托变化对谓词fetchRequest其NSFetchedResultsController和电话-[NSFetchedResultsController performFetch:].接下来,必须通知集合视图内容已更改.这可以通过多种方式完成,但我喜欢的方式是通过调用-[UICollectionView reloadData].不幸的是,这种方法不能像预期的那样工作:当我调用这个方法时,整个集合视图就会消失.以下是我就此问题所做的一些观察:
hidden标志设置为YES.我尝试通过设置符号断点来跟踪导致此问题的方法-[UIView setHidden:].不幸的是,它从未打破UICollectionView子视图.collectionView:cellForItemAtIndexPath:在打电话后从未打过电话-[UICollectionView reloadData].collectionView:viewForSupplementaryElementOfKind:atIndexPath:在打电话后从未打过电话-[UICollectionView reloadData].numberOfSectionsInCollectionView: 仍然被调用并仍然返回正确的数字(在这种情况下为1).collectionView:numberOfItemsInSection 仍然被调用并仍然返回正确的数字(在这种情况下为1).到目前为止我尝试过解决这个问题的方法:
sectionInset,itemSize)UICollectionViewFlowLayoutseparatorInset上的所有自定义()UICollectionViewUICollectionView并相应地进行设置contentInset.不幸的是UICollectionView,当我这样做时,不喜欢我的自动布局约束和崩溃.[UICollectionView reloadSections:]而不是[UICollectionView reloadData].这有效,但我不喜欢动画.-[UICollectionView dealloc].以这种方式设置标头感觉不对,但遗憾的UICollectionView是没有像UITableView(tableHeaderView)这样的全局标头.
我希望在NSCache实例中某个键对应的对象发生更改时收到通知.我试过没有运气使用键值观察(控制台不记录任何东西).
- (void)viewDidLoad
{
[super viewDidLoad];
[self.cache addObserver:self forKeyPath:@"myKey" options:NSKeyValueObservingOptionNew context:NULL];
[self.cache setObject:@"myObject" forKey:@"myKey"];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"KEYPATH CHANGED: %@", keyPath);
}
Run Code Online (Sandbox Code Playgroud)
如何观察NSCache的内容?