Questions tagged «key-value-observing»


4
视图控制器之间进行通信的最佳方式是什么?
作为对Objective-C,可可和iPhone开发人员的新手,我强烈希望充分利用语言和框架。 我正在使用的资源之一是斯坦福大学的CS193P类笔记,它们已经留在网上了。它包括讲义,作业和示例代码,并且由于该课程是由Apple开发人员提供的,因此我绝对认为它是“从马口算起的”。 课堂网站:http: //www.stanford.edu/class/cs193p/cgi-bin/index.php 第08课与构建基于UINavigationController的应用程序有关,该应用程序将多个UIViewControllers推送到UINavigationController堆栈上。这就是UINavigationController的工作方式。这是合乎逻辑的。但是,幻灯片中有一些关于UIViewController之间进行通信的严厉警告。 我将从这些严肃的幻灯片中引用:http : //cs193p.stanford.edu/downloads/08-NavigationTabBarControllers.pdf 第16/51页: 如何不共享数据 全局变量或单例 这包括您的应用程序委托 直接依赖关系使代码的可重用性降低 而且更难调试和测试 好。我对此感到沮丧。不要盲目地将用于在viewcontroller之间进行通信的所有方法扔到您的应用程序委托中,并在应用程序委托方法中引用viewcontroller实例。公平的诺夫。 再进一步,我们得到这张幻灯片,告诉我们应该做什么。 第18/51页: 数据流最佳实践 弄清楚究竟需要传达什么 为您的视图控制器定义输入参数 为了在层次结构之间进行通讯,请使用松散耦合 为观察者定义通用接口(例如委派) 然后,在此幻灯片之后是看似占位符的幻灯片,在该幻灯片中,讲师显然使用UIImagePickerController的示例演示了最佳实践。我希望这些视频可用!:( 好的,所以...我怕我的objc-fu不太牢固。我也对上面引用的最后一行感到困惑。我一直在尽职调查这个问题,发现似乎是一篇体面的文章,在谈论观察/通知技术的各种方法:http : //cocoawithlove.com/2008/06/five-approaches-to -listening-observing.html 方法5甚至将委托表示为方法!除了...对象只能一次设置一个委托。因此,当我有多个ViewController通讯时,我该怎么办? 好的,那是设置帮派。我知道我可以通过引用appdelegate中的多个viewcontroller实例轻松地在应用程序委托中执行通信方法,但是我想以正确的方式进行此类操作。 请回答以下问题,以帮助我“做正确的事”: 当我尝试在UINavigationController堆栈上推送新的viewcontroller时,谁应该执行此推送。 我的代码中哪个类/文件是正确的位置? 当我想影响一些数据块(伊娃的值),我UIViewControllers之一,当我在不同的UIViewController,什么是“正确”的方式做到这一点? 假设我们一次只能在一个对象中设置一个委托,那么当讲师说“为观察者定义通用接口(如委托)”时,实现将是什么样子。如果可能的话,一个伪代码示例将非常有帮助。

7
为什么要使用ivar?
我通常会以相反的方式问这个问题,例如,每个ivar都必须是一个属性吗?(而且我喜欢bbum对这个问题的回答)。 我几乎只在代码中使用属性。但是,我经常与一个承包商合作,该承包商已经在iOS上开发了很长时间,并且是传统的游戏程序员。他编写的代码几乎不声明任何属性,而是依靠ivars。我认为他这样做是因为1.)他习惯了,因为直到Objective C 2.0('Oct '07)和2.)才开始存在属性,以实现不通过getter / setter方法的最小性能提升。 尽管他编写的代码不会泄漏,但我仍然希望他使用属性而不是ivars。我们讨论了这个问题,由于我们没有使用KVO,他或多或少地认为没有理由使用属性,并且他在处理内存问题方面经验丰富。 我的问题是更多...为什么您要使用ivar期间-经验丰富与否。是否确实有很大的性能差异可以证明使用ivar是合理的? 同样,为了澄清起见,我根据需要覆盖了setter和getter,并使用了与getter / setter内部与该属性相关的ivar。但是,在getter / setter或init之外,我始终使用self.myProperty语法。 编辑1 我感谢所有的良好回应。我想解决的一个看起来不正确的问题是,使用ivar可以封装,而使用属性则不需要。只需在类延续中定义属性即可。这将使财产对外界隐藏。您还可以在接口中将属性声明为readonly,然后在实现中将其重新定义为readwrite,例如: // readonly for outsiders @property (nonatomic, copy, readonly) NSString * name; 并在课堂上继续学习: // readwrite within this file @property (nonatomic, copy) NSString * name; 要使其完全“私有”,只能在类继续中声明它。

10
如何判断对象是否附加了键值观察器
如果您告诉一个目标c对象removeObservers:对于一个关键路径而该关键路径尚未注册,这将使您难过。喜欢 - “无法从中删除键路径“ theKeyPath”的观察者,因为它没有注册为观察者。 有没有一种方法可以确定一个对象是否具有注册的观察者,所以我可以这样做 if (object has observer){ remove observer } else{ go on my merry way }

3
KVO和ARC如何删除
如何从ARC下的对象中删除观察者?我们只是添加观察者而忘记删除它吗?如果我们不再手动管理内存,该从何处辞职? 例如,在视图控制器上: [self.view addObserver:self forKeyPath:@"self.frame" options:NSKeyValueObservingOptionNew context:nil]; 以前,我将调用removeObserver:视图控制器的dealloc方法。


7
观察NSMutableArray的插入/移除
一个类具有NSMutableArray类型的属性(和实例var),具有综合访问器(通过@property)。如果您使用以下方法观察此数组: [myObj addObserver:self forKeyPath:@"theArray" options:0 context:NULL]; 然后像这样在数组中插入一个对象: [myObj.theArray addObject:NSString.string]; 没有发送observeValueForKeyPath ...通知。但是,以下确实会发送适当的通知: [[myObj mutableArrayValueForKey:@"theArray"] addObject:NSString.string]; 这是因为mutableArrayValueForKey返回一个负责通知观察者的代理对象。 但是综合访问器是否不应该自动返回这样的代理对象?解决此问题的正确方法是什么?我应该编写一个仅调用的自定义访问器[super mutableArrayValueForKey...]吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.