Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在块iphonesdk中引用self_Iphone_Objective C_Closures_Objective C Blocks_Self - Fatal编程技术网

在块iphonesdk中引用self

在块iphonesdk中引用self,iphone,objective-c,closures,objective-c-blocks,self,Iphone,Objective C,Closures,Objective C Blocks,Self,我试图实现一种回调机制,在这种机制中,我将一个块传递给一个类的init,在完成一些工作后,该类将调用我。块会被调用,并且大多数东西都会工作,除了我调用块中“self”上的任何东西。我收到程序接收信号:“EXC_BAD_ACCESS”,除非我注释掉块内对self的任何引用 我认为我可以在街区内接近自我,这是错误的吗? 如有任何建议,将不胜感激。这段代码是在一个全新的“通用应用程序”中,我目前正在IPad部分工作,所以在IPad模拟器下运行 一些代码: __block LoginViewContro

我试图实现一种回调机制,在这种机制中,我将一个块传递给一个类的init,在完成一些工作后,该类将调用我。块会被调用,并且大多数东西都会工作,除了我调用块中“self”上的任何东西。我收到程序接收信号:“EXC_BAD_ACCESS”,除非我注释掉块内对self的任何引用

我认为我可以在街区内接近自我,这是错误的吗? 如有任何建议,将不胜感激。这段代码是在一个全新的“通用应用程序”中,我目前正在IPad部分工作,所以在IPad模拟器下运行

一些代码:

__block LoginViewController *blockSelf = self;
    LoginAlertView *alert = [[LoginAlertView alloc] 
                         intWithPinPrompt:NO 
                         title:@"Mobile Login"
                         myCallback:^(LoginAlertView *v){
                             DLog(@"self %@", blockSelf);
                             NSString *u = v.userNameText;
                             NSString *p = v.passwordText;
                             NSString *i = v.pinText;
                             [self authenticateUser:u
                                           password:p
                                                pin:i];
                         }];
下面是LoginAlertView中的一些代码

- (id) intWithPinPrompt:(BOOL)pinPromptEnabled title:(NSString*)aTitle myCallback:(loginClicked)aCallback{
if (self = [self initWithTitle:aTitle
                       message:nil 
                      delegate:self 
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:@"Login", nil]) {
    hasPinPrompt = pinPromptEnabled;
    theCallback = aCallback;
}
return self;
}
回拨电话呢

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
if (theCallback) {
    theCallback(self);
}
}
我改为下面的代码行

theCallback = aCallback;

这给我带来了以下错误

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) bt
#0  0x029c8c97 in objc_msgSend ()
#1  0xbfffe560 in ?? ()
#2  0x00026f66 in -[LoginViewController show] (self=0x4a38450, _cmd=0x209c36c) at LoginViewController.m:18
#3  0x00026d3b in -[AuthenticatedViewController viewWillAppear:] (self=0x4c1fac0, _cmd=0x20b59ac, animated=0 '\0') at AuthenticatedViewController.m:17
还有一件事,我的块的定义如下

typedef void(^loginClicked)(LoginAlertView*);
成员变量是

loginClicked theCallback;

还尝试将块的声明向上移动到变量,并将其传入。每当我在bock上使用“复制”时,就会收到可怕的程序接收信号:“EXC\U BAD\U ACCESS”。我想这可能是一个IOS3.2的东西,所以我试着在iPhone4.0模拟器下运行它,结果是一样的。为了将块“复制”到堆上,是否可能需要进行编译器设置?我正在使用LLVM1.5,首先,代码中的
blockSelf
是什么

其次,不,没有理由不能使用
self
,这表明代码中存在错误

特别是,您没有复制块。块从堆栈开始。因此,当你说
theCallback=aCallback,您正在存储对堆栈上数据结构的引用。一旦定义堆栈帧消失,该结构就不再有效


更改
theCallback=aCallback
theCallback=[aCallback副本]
(并将
[Callback release];
添加到您的
-dealloc
方法中)。

首先,您的代码中的
blockSelf
是什么

其次,不,没有理由不能使用
self
,这表明代码中存在错误

特别是,您没有复制块。块从堆栈开始。因此,当你说
theCallback=aCallback,您正在存储对堆栈上数据结构的引用。一旦定义堆栈帧消失,该结构就不再有效


更改
theCallback=aCallback
theCallback=[aCallback副本]
(并将
[Callback release];
添加到您的
-dealloc
方法中)。

感谢您的回复。嗯,在调用LoginAlert alloc之前,我有一行代码,上面写着u block LoginViewController*blockSelf=self;我试图看看问题是否与self不可变有关,从我读到的内容来看,除非使用_,否则堆栈上的块变量只能作为块中的“Const”使用。我知道堆栈上没有定义self,但我认为值得一试。当我将您的代码行“the copy”添加到LoginAlertView的init时,我得到以下程序接收信号:“EXC_BAD_ACCESS”。这是堆栈上开始的块,这就是问题所在。您是否正确复制了块(我的答案中有一个错误;复制回调而不是回调)?添加为“答案”以获得代码格式,并允许您的响应包含500多个字符。嗯,在调用LoginAlert alloc之前,我有一行代码,上面写着u block LoginViewController*blockSelf=self;我试图看看问题是否与self不可变有关,从我读到的内容来看,除非使用_,否则堆栈上的块变量只能作为块中的“Const”使用。我知道堆栈上没有定义self,但我认为值得一试。当我将您的代码行“the copy”添加到LoginAlertView的init时,我得到以下程序接收信号:“EXC_BAD_ACCESS”。这是堆栈上开始的块,这就是问题所在。您是否正确复制了块(我的答案中有一个错误;复制回调而不是回调)?添加为“答案”以获得代码格式,并允许超过500个字符
loginClicked theCallback;