[iOS]观察者模式如何传递参数 addObserver:forKeyPath:options:context:

注册一个观察者

- (void)addNewObserver
{
    [object addObserver:self
             forKeyPath:@"oneKey"
                options:NSKeyValueObservingOptionNew
                context:(__bridge_retained void *)(pragma)];
}

context:需要传递的对象是一个(void *)类型的数据,这是一个C类型的对象,我们需要做的就是将id类型的对象转成C类型。

pragma是需要传递的具体数据,经过(__bridge_retained void *)强转为void * , 注意,对象被retained了,无论你的工程是不是arc的,都要在使用完成之后手动释放一下。

观察数据

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"oneKey"])
    {
        //Do something
        if (workDone == YES)
        {
            CFBridgingRelease(context);
        }
    }
}

当工作全部完成后(workDone == YES),手动释放一下刚才被retained的对象,CFBridgingRelease(context).

时间: 2024-07-28 18:45:36

[iOS]观察者模式如何传递参数 addObserver:forKeyPath:options:context:的相关文章

ios页面间传递参数四种方式

ios页面间传递参数四种方式 1.使用SharedApplication,定义一个变量来传递. 2.使用文件,或者NSUserdefault来传递 3.通过一个单例的class来传递 4.通过Delegate来传递. IOS开发使用委托delegate在不同窗口之间传递数据是本文要介绍的内容,主要是来讲解如何使用委托delegate在不同窗口之间传递数据,具体内容来看详细内容.在IOS开发里两个UIView窗口之间传递参数方法有很多,比如 前面3种方法,暂且不说,这次主要学习如何使用通过Dele

addObserver forKeyPath options 注意事项

[self.layer addObserver:self forKeyPath:@"cornerRadius" options:NSKeyValueObservingOptionNew context:nil]; 添加一个监听 在运行过程中可能出现错误 EXC_BAD_ACCESS 这是因为没有在dealloc中removeObserver的问题 但是有时不确定一个监听有没有添加时, 在dealloc进行removeObserver时又会报 because it is not regi

Android/iOS访问wcf传递参数为实体对象的问题

简单记录一下使用实体对象作为参数的传递! 在服务端使用webservice时是没有问题的,但是当替换成wcf时就出现传递的参数无法序列化的问题! 服务端代码: Service1.svc namespace WcfTeacherService { // 注意: 使用"重构"菜单上的"重命名"命令,可以同时更改代码.svc 和配置文件中的类名"Service1". // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择

iOS 观察者模式(KVO)的简单使用

KVO的全称是Key-Value Observing,它实现了一种机制,对所关心的属性对象添加观察者,当属性值发生变化时会得到通知,我们可以对变化做相应的处理.看过设计模式的同学应该知道,这是一种典型的观察者模式.KVO的最大优点就是底层框架已经支持,开发人员不需要实现属性值发生变化时发送通知的方案,这样就大大减少开发的工作量.其次,KVO框架很强大,可以支持多个观察者观察同一属性,或者一个观察者监听不同属性. KVO的使用比较简单,基本上都是三步: 1.注册观察者 addObserver:fo

iOS开发之@Selector参数的传递

比如: NSMutableDictionary *dic = [[NUMutableDictionary alloc]init]; [dic setValue:@”haha” forKey:@”test”] [NSTimer scheduledTimerWithTimeIntervatal:2.0 target:self selector: @selecrtor(onTimer:) userInfo:dic repeats:NO]; 关于上述调用onTimer:方法时怎么传递参数,可能在这里会有

App打开微信小程序并传递参数

在App中打开小程序的功能发布有一段时间了,网上关于这个的新闻很多,但是技术资料并不多,我们有项目需要尝试这种方式,特意试了一下,发现还是有一些坑,分享给大家. 首先微信官方文档在微信.开放平台上,截图如下: 一. 开发前先得做好几个准备工作: 在微信开放平台上有账号而且有通过的移动应用. 2.在微信公众平台有账号而且有小程序,最好发布为体验版本. 3.在微信开放平台把对应的移动应用和小程序建立关联.这个过程来回需要登陆和扫二维码n次. 二. 在android和ios调试官方sample打开小程

请写出并说明如何在命令行下运行PHP脚本(写出两种方式)同时向PHP脚本传递参数

方法一: <?php if ($argc > 1){ print_r($argv); } ?> php.exe test.php welcome Ricky Feng 方法二: 还有一种这样的,提示用户输入,然后获取输入的参数.有点像C语言 <?php fwrite(STDOUT, "Enter your name: "); $name = trim(fgets(STDIN)); fwrite(STDOUT, "Hello, $name!")

通过注册的URL Scheme向目标APP传递参数

通过注册的URL Scheme向目标APP传递参数 通过URL Scheme启动APP很简单就可以做到,但有时候我们想在启动APP的时候传递一些参数,这个时候我们就可以通过URL Scheme自定义URL来传递参数了. 昨天我们在AppDelegate调用了UIApplicationDelegate的代理方法: - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url { // 接受传过来的参数 NSSt

在 Angularjs 中 ui-sref 和 $state.go 如何传递参数

1 ui-sref.$state.go 的区别 ui-sref 一般使用在 <a>...</a>: <a ui-sref="message-list">消息中心</a> $state.go('someState')一般使用在 controller里面: .controller('firstCtrl', function($scope, $state) { $state.go('login'); }); 这两个本质上是一样的东西,我们看ui