分享

主题 : NSNotificationCenter 多次执行通知方法 我是通过push进入一个VC

 没原创_去搜索 2015-08-05

NSNotificationCenter 多次执行通知方法 我是通过push进入一个VC    

//初始化VC 


ProductClassViewController *productClassVC = [[ProductClassViewController allocinit];


 productClassVC.delegate = self;


 productClassVC.hidesBottomBarWhenPushed = YES;


  [[GlobalDataAccess sharedInstancedownProductClassData:PRODUCT_ONEDATA


                                                   customID:[FunctHelperClass getClickCustomID]


                                             productClassId:0];//异步请求数据获得数据之后发送消息


    [self.navigationController pushViewController:productClassVC animated:YES];





//ProductClassViewController  VC中注册观察者


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil












{


 self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];


    if (self) {


        //注册通知


        [[NSNotificationCenter defaultCenteraddObserver:self


                                                 selector:@selector(loadOneTableView:)


                                                     name:PRODUCT_ONEDATA
















                                                   object:[GlobalDataAccess sharedInstance]];    


    }


    reture self;


}



//执行通知方法


- (void)loadOneTableView:(NSNotification *)userInfo{


   NSLog(@“132456”);


}





//移除通知


- (void)dealloc{//移除通知


    [[NSNotificationCenter defaultCenterremoveObserver:self];













}



最后结果是我push第一次,结果是打印:


132456


返回之后push第二次,结果打印:


132456


132456


返回之后push第三次,结果打印:


132456


132456


132456


问题1:



之后都是返回,再次push通知方法就会多执行一次,不知道原因,请问各位大神可能这种问题的原因?希望分享给小弟参考一下,感激不尽!



问题2:


就是有时候不执行dealloc方法,这又是为什么呢?


对了小弟用的xcode4.6.2版本。IOS 6.1


希望各位大神能给出指点



更新




在各位大神的指导下上面的问题解决了。


- (void)viewWillAppear:(BOOL)animated这里面注册通知


- (void)viewWillDisappear:(BOOL)animated里面移除通知


这样做之后问题又出现了:


现在的问题是:


我在UITabBarController中添加了两个VC1/VC2,两个VC中分有这个。(总共有三个VC:VC1、VC2、VC3);三个VC中均由注册通知和移除通知及这两个方法


- (void)viewWillAppear:(BOOL)animated这里面注册通知


- (void)viewWillDisappear:(BOOL)animated里面移除通知


最开始加载的时VC1、VC2,显示出来的是VC1.我通过点击tabBar到VC2.在VC2中有个button通过button跳转到VC3.然而我在这个时候通过点击tabBar切换到VC1是,就出现了这样的问题:


-[NSNotificationCenter removeObject:]: unrecognized selector sent to instance 0x903e4c0












2013-10-18 11:25:19.567 GOCloud[1494:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNotificationCenter removeObject:]: unrecognized selector sent to instance 0x903e4c0'


不知道什么原因,跟踪代码时发现:在点击VC1这个tabBar时,VC3中的这个方法


- (void)viewWillDisappear:(BOOL)animated里面移除通知


还没有执行,就开始执行VC1中的-


 (void)viewWillAppear:(BOOL)animated这里面注册通知 


方法了。不知道时什么情况导致的希望哪位大神给点意见,给点思维。


谢谢了







级别: 新手上路
UID: 149385
精华: 0 
发帖: 34
可可豆: 37 CB
威望: 39 点
在线时间: 18(时)
注册时间: 2012-06-17
最后登录: 2015-06-01
沙发 :发表于: 2013-10-14 18:22   发自: Web Page

view appear  addnotifi


 


viewdisappear  removenotifi


级别: 骑士
 
状态: 未签到 - [82天]
UID: 156085
精华: 0 
发帖: 352
可可豆: 727 CB
威望: 896 点
在线时间: 515(时)
注册时间: 2012-07-20
最后登录: 2015-08-04
板凳 :发表于: 2013-10-14 19:39   发自: Web Page
这个问题应该是你多次注册 通知造成的, 首先你看一下你这个 PRODUCT_ONEDATA 这个name的通知有几个,确定是一个然后再看 pop 回去之后 是否 被释放了(dealloc是否被调用了)。 







建议你通知的注册和移除最好写在 viewWillAppear  和 viewWillDisappear 里面


级别: 新手上路
 
状态: 未签到 - [2天]
UID: 262645
精华: 0 
发帖: 48
可可豆: 140 CB
威望: 89 点
在线时间: 68(时)
注册时间: 2013-09-25
最后登录: 2015-08-04
3 楼: 发表于: 2013-10-15 09:02   发自: Web Page
是先移除,后注册。我先试一下,待会儿我再给你回复。
谢谢了 
级别: 新手上路
 
状态: 未签到 - [2天]
UID: 262645
精华: 0 
发帖: 48
可可豆: 140 CB
威望: 89 点
在线时间: 68(时)
注册时间: 2013-09-25
最后登录: 2015-08-04
4 楼: 发表于: 2013-10-15 09:06   发自: Web Page
如果在viewWillAppear 里面进行注册的话,会导致发送通知时,观察者还没有注册。这样有可能收不到通知 
级别: 新手上路
 
状态: 未签到 - [2天]
UID: 262645
精华: 0 
发帖: 48
可可豆: 140 CB
威望: 89 点
在线时间: 68(时)
注册时间: 2013-09-25
最后登录: 2015-08-04
5 楼: 发表于: 2013-10-15 09:32   发自: Web Page
谢谢,一点问题也没有 
级别: 新手上路
 
状态: 未签到 - [2天]
UID: 262645
精华: 0 
发帖: 48
可可豆: 140 CB
威望: 89 点
在线时间: 68(时)
注册时间: 2013-09-25
最后登录: 2015-08-04
6 楼: 发表于: 2013-10-15 09:33   发自: Web Page
谢谢顶一下呵呵 
级别: 骑士
 
状态: 未签到 - [82天]
UID: 156085
精华: 0 
发帖: 352
可可豆: 727 CB
威望: 896 点
在线时间: 515(时)
注册时间: 2012-07-20
最后登录: 2015-08-04
7 楼: 发表于: 2013-10-16 11:40   发自: Web Page
官方demo api都告诉我们最好 viewWillAppear 和 viewWillDisappear 里面 
viewcontroller的生命周期
当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序
1、 alloc 创建对象,分配空间
2、init (initWithNibName) 初始化对象,初始化数据
3、loadView 从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
4、viewDidLoad 载入完成,可以进行自定义数据以及动态创建其他控件
5、viewWillAppear 视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6、viewDidAppear 视图已在屏幕上渲染完成

当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
1、viewWillDisappear 视图将被从屏幕上移除之前执行
2、viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放 
级别: 新手上路
 
状态: 未签到 - [2天]
UID: 262645
精华: 0 
发帖: 48
可可豆: 140 CB
威望: 89 点
在线时间: 68(时)
注册时间: 2013-09-25
最后登录: 2015-08-04
8 楼: 发表于: 2013-10-18 11:43   发自: Web Page
哦,感谢。
mark一下。
学习了这样为题又出来了?
请看上面我补充了。
谢谢了
希望能给点建议 
级别: 新手上路
 
状态: 未签到 - [2天]
UID: 262645
精华: 0 
发帖: 48
可可豆: 140 CB
威望: 89 点
在线时间: 68(时)
注册时间: 2013-09-25
最后登录: 2015-08-04
9 楼: 发表于: 2013-10-18 11:44   发自: Web Page
现在的问题是:

我在UITabBarController中添加了两个VC1/VC2,两个VC中分有这个。(总共有三个VC:VC1、VC2、VC3);三个VC中均由注册通知和移除通知及这两个方法

- (void)viewWillAppear:(BOOL)animated这里面注册通知

- (void)viewWillDisappear:(BOOL)animated里面移除通知

最开始加载的时VC1、VC2,显示出来的是VC1.我通过点击tabBar到VC2.在VC2中有个button通过button跳转到VC3.然而我在这个时候通过点击tabBar切换到VC1是,就出现了这样的问题:

-[NSNotificationCenter removeObject:]: unrecognized selector sent to instance 0x903e4c0

2013-10-18 11:25:19.567 GOCloud[1494:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNotificationCenter removeObject:]: unrecognized selector sent to instance 0x903e4c0'

不知道什么原因,跟踪代码时发现:在点击VC1这个tabBar时,VC3中的这个方法

- (void)viewWillDisappear:(BOOL)animated里面移除通知

还没有执行,就开始执行VC1中的-

(void)viewWillAppear:(BOOL)animated这里面注册通知 

方法了。不知道时什么情况导致的希望哪位大神给点意见,给点思维。

谢谢了 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多