0

我可以创建 UIButton。
但是回调:目标:对象在当前对象中不起作用。??
我只能做“self.viewController”对象,不能为当前对象做“self”。

谢谢


#import <Foundation/Foundation.h>
#import "ViewController.h"

@class ViewController;

@interface CGuiSetup : NSObject
{
    @public
    ViewController *viewController;
}
- (void) Setup;
- (void) ButtonRespond:(UIButton*) btn;
@end

#import "CGuiSetup.h"

@implementation CGuiSetup

- (void) ButtonRespond:(UIButton*) btn
{
    NSLog(@"ButtonRespond");
}


- (void) Setup
{

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btn setFrame:CGRectMake(10,10,100,100)];

    // But I want to call the following in the CGuiSetup object (self) instead... but it crashes out if I leave it as just "self"
    [btn addTarget:self.viewController action:@selector(ButtonRespond:)
        forControlEvents:UIControlEventTouchUpInside]; //works: for "self.viewController" if I put ButtonRespond in the ViewController

    [btn addTarget:self action:@selector(ButtonRespond:)
        forControlEvents:UIControlEventTouchUpInside]; //fails: for "self"

    [self.viewController.view addSubview:btn];
}
@end

#import <UIKit/UIKit.h>
#import "CGuiSetup.h"

@class CGuiSetup;

@interface ViewController : UIViewController
{
    CGuiSetup *guiSetup; //<---- had to take this out of the "viewDidLoad" method
}
@end

- (void)viewDidLoad
{
    [super viewDidLoad];

    guiSetup = [CGuiSetup alloc];
    guiSetup->viewController = self;


    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btn setFrame:CGRectMake(10,10,100,100)];
    [btn addTarget:guiSetup action:@selector(ButtonRespond:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];

}
4

2 回答 2

2

如果您使用 ARC,是否有任何对象具有对 CGuiSetup 的保留引用?我听起来像 CGuiSetup 被实例化,创建(或者可能从另一个对象接收)viewController,将按钮添加到它,然后将视图控制器提供给另一个对象(可能通过将它推到 navController 上或将其设置为的根控制器应用程序)?不管是什么情况,CGuiSetup 都会被释放,并且按钮正试图向已经被销毁的对象发送消息。CGuiSetup 是如何/在哪里创建的?什么对象保留了对它的引用?这可能就是你的问题所在。

如果您不了解什么是保留/释放和/或您不知道什么是 ARC,则需要阅读 Apple 的内存管理指南:https ://developer.apple.com/library/mac/#documentation/Cocoa /Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

于 2012-05-07T00:09:27.290 回答
1

这可能是因为您的对象已被销毁,而 _viewController 的保留计数仍大于 0(因此它没有被销毁)。平衡您保留/释放的数量。

于 2012-05-06T23:09:00.220 回答