gpt4 book ai didi

objective-c - 我可以将 NSWindow 的引用传递给自定义对象并使用该对象添加 NSButton 和 Action 吗?

转载 作者:行者123 更新时间:2023-12-03 17:51:39 25 4
gpt4 key购买 nike

我想知道是否可以将 NSWindow 的引用传递给自定义对象,然后使用该对象添加 NSButton 以及该按钮的关联操作/选择器。

当我尝试这样做时,我似乎遇到了问题。当我运行示例程序并单击按钮时,出现以下运行时错误:线程1:EXC_BAD_ACCESS(代码=1,地址=0x18)

这是我的代码:

//  AppDelegate.h

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
@end

// AppDelegate.m

#import "AppDelegate.h"
#import "CustomObject.h"
@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
CustomObject *test = [[CustomObject alloc]init];
[test createButton:_window];
}
@end


// CustomObject.h

#import <Foundation/Foundation.h>

@interface CustomObject : NSObject
{
int test;
NSButton *testButton;
}
- (IBAction)pressCustomButton:(id)sender;

-(void)createButton:(NSWindow*)win;
@end

// CustomObject.m

#import "CustomObject.h"

@implementation CustomObject

-(IBAction)pressCustomButton:(id)sender
{
NSLog(@"pressCustomButton");
}

-(void)createButton:(NSWindow*)win
{
testButton = [[NSButton alloc] initWithFrame:NSMakeRect(100, 100, 200, 50)];

[[win contentView] addSubview: testButton];
[testButton setTitle: @"Button title!"];
[testButton setButtonType:NSMomentaryLightButton]; //Set what type button You want
[testButton setBezelStyle:NSRoundedBezelStyle]; //Set what style You want

[testButton setTarget:self];
[testButton setAction:@selector(pressCustomButton:)];
}
@end

最佳答案

首先,我假设您正在使用自动引用计数。

当您单击按钮时,应用程序会尝试调用按钮目标的 pressCustomButton: 方法,CustomObject 实例将其设置为其自身。但是,CustomObject 的实例已被释放。

采用以下代码:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
CustomObject *test = [[CustomObject alloc]init];
[test createButton:_window];
}

一旦该方法被调用完毕,如果您使用 ARC,您创建的 CustomObject 实例将被释放。由于 NSControl 子类(如 NSButton)不保留其目标(以避免保留循环/强引用循环),这也会导致 CustomObject 实例被解除分配。这将导致发送到该实例的任何后续消息产生意外结果,例如崩溃。

为了防止这种情况发生,您需要将 CustomObject 实例保留在 applicationDidFinishLaunching: 方法之外。有几种方法可以做到这一点,例如将其作为 AppDelegate 的属性,或者如果您计划拥有多个对象,请使用 NSMutableArray 将它们存储在.

类似于以下内容:

@interface AppDelegate : NSObject <NSApplicationDelegate>
....
@property (nonatomic, strong) NSMutableArray *customObjects;
@end

// AppDelegate.m

#import "AppDelegate.h"
#import "CustomObject.h"
@implementation AppDelegate

- (id)init {
if ((self = [super init])) {
customObjects = [[NSMutableArray alloc] init];
}
return self;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
CustomObject *test = [[CustomObject alloc]init];
[customObjects addObject:test];
[test createButton:_window];
}
@end

关于objective-c - 我可以将 NSWindow 的引用传递给自定义对象并使用该对象添加 NSButton 和 Action 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24891824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com