1. 程式人生 > >block 傳值 遇到的出錯點:Thread 1:EXC_BAD_ACCESS(code=1,address=0x10)

block 傳值 遇到的出錯點:Thread 1:EXC_BAD_ACCESS(code=1,address=0x10)

Home介面也就是需要接收值的介面。

#pragma mark 推出登入介面

-(void)loginAction:(id)sender

{

LoginViewController *loginVC = [[LoginViewControlleralloc]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.navigationControllerpushViewController:[LoginViewControllernew] 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 = [[DBManagersharedDBManager] 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.navigationControllerpopToRootViewControllerAnimated:YES];

        }

    }

}

============================

正確的修改:

在要接收值的介面中:

[self.navigationControllerpushViewController[LoginViewControllernewanimated:YES];

改為:

[self.navigationControllerpushViewController:loginVC animated:YES];


==============================

還需要注意的一點就是,block傳值,傳值語句是在推出第一個頁面之前,接收值的語句是在第一個頁面推出第二個頁面之前。

因為,block塊之後的語句比block塊內的語句先執行。