block 傳值 遇到的出錯點:Thread 1:EXC_BAD_ACCESS(code=1,address=0x10)
2015-10-12 17:02:35 瀏覽(89)
[摘要:Home界里也便是須要吸收值的界里。
#pragma mark 推出登錄界里
-(void)loginAction:(id)sender {
LoginViewController *loginVC = [[LoginViewController all];
}
Home界面也就是需要接收值的界面。
#pragma mark 推出登錄界面
-(void)loginAction:(id)sender
{
LoginViewController *loginVC = [[LoginViewController alloc]init];
#warning 遇到block,先執行block塊外的語句,再執行塊內語句
//block 的定義
loginVC.block = ^(NSString *text){
// self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:text style:UIBarButtonItemStyleDone target:nil action:nil];
NSLog(@"傳過來的值:%@",text);
};
#warning 前后創建的對象是不一樣的
//之前出錯就是一到LoginViewController.m中的self.block(name)就直接斷了,原因是因為我在這里的跳轉之前又創建了一個新的.
[self.navigationController pushViewController:[LoginViewController new] animated:YES];
}
====================================
傳值的那個界面的.h
#import <UIKit/UIKit.h>
//聲明一個block用來傳值,注意給block取別名的默認返回值是int
typedef void (^blockLoginTitle)(NSString *title);
@interface LoginViewController : UIViewController
//聲明一個屬性,方便使用blockLoginTitle
@property(nonatomic,strong)blockLoginTitle block;
@end
===========================
.m
#pragma mark 登錄按鈕事件的響應
-(void)loginBtnAction:(UIButton *)sender
{
//獲取登錄界面的輸入信息
NSString *name = _loginView.nameLTView.textField.text;
NSString *pwd = _loginView.passLTView.textField.text;
#pragma mark 去數據庫中取到值
NSArray *result = [[DBManager sharedDBManager] selectAllUser];
for (User *user in result) {
if ([name isEqualToString:user.name] && [pwd isEqualToString:user.password])
{
#warning 這里直接出錯,沒有任何錯誤提醒,只有 Thread 1:EXC_BAD_ACCESS(code=1,address=0x10)
//調用block
self.block(name);
[self.navigationController popToRootViewControllerAnimated:YES];
}
}
}
============================
正確的修改:
在要接收值的界面中:
把
[self.navigationController pushViewController[LoginViewController new] animated:YES];
改為:
[self.navigationController pushViewController:loginVC animated:YES];
==============================
還需要注意的一點就是,block傳值,傳值語句是在推出第一個頁面之前,接收值的語句是在第一個頁面推出第二個頁面之前。
因為,block塊之后的語句比block塊內的語句先執行。