gpt4 book ai didi

objective-c - 创建另一个类的实例的实例

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

我正在尝试将一些“ super 对象”分解为具有单一(或至少有限)责任的更易于管理的类。

我刚刚遇到的一个问题是创建 UIBarButtonItem 的特定实例的对象。在现在所在的类中,我首先定义一个 UIButton,然后将充当该按钮图标的所有图像作为 subview (例如,按钮代表对设备的访问/控制,我使用按钮图像来显示该设备的当前信号强度)。此外,该按钮正在监听来自设备对象的 NSNotifications,以表示信号强度的变化,或者设备是否断开连接。按下按钮会向设备发送一条消息以断开连接。所有这些代码现在作为 RootViewController 的属性都可以正常工作。但是,我想将其拉出到自己的类中,因为该按钮由多个类共享,并且它只会用不必要的方法使 Controller 变得困惑。

我尝试使用如下所示的 init 创建一个单独的类。但是,这不起作用,因为用于按钮的 self 与最终由 [UIBarButtonItem alloc] 创建的 self 不同,并且当 NSNotification 或按下按钮尝试向“self”的选择器发送消息时,该对象已被释放。问题是,我不确定如何创建一个对象(由类定义),该对象只是另一个类的实例,而不是对象的属性(目前是 RootViewController 的属性)。

对我的问题进行编辑和补充说明

MyClass 当前是 UIBarButtonItem 的子类。但是,我并不想像这样使用它:[[MyClass alloc] initWithCustomView:]。我希望 [MyClass alloc] init] 本身完全创建自定义 View - 换句话说,此类的全部要点是完全包含此按钮创建自身、管理其 subview 并采取适当操作所需的所有内容当它被按下时。 (我可以轻松地将 MyClass 设为 NSObject,并使用 [MyClass setupButton] 等公共(public)方法和 UIBarButtonItem 类型的公共(public)属性。但是,我认为这看起来是错误的,因为该类仅用于创建按钮,但它不是按钮本身。)

@interface MyClass : UIBarButtonItem
@end

@implementation MyClass
- (id)init {
if (self = [super init]) {

UIImage *defaultButton = [[UIImage imageNamed:@"...
UIImage *defaultButtonPressed = [[UIImage imageNamed:@"....
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 30)];
[button setBackgroundImage:defaultButton forState:UIControlStateNormal];
[button setBackgroundImage:defaultButtonPressed forState:UIControlStateHighlighted];
[button addTarget:self action:@selector(deviceButtonPressed) forControlEvents:UIControlEventTouchUpInside];

//Then several UIImageViews that are added as subviews of the button, initially hidden

//Then set up the NSNotification listener

//Finally
self = [[UIBarButtonItem alloc] initWithCustomView:button];
}

return self;
}

//Then several functions to handle hiding and unhiding the subviews depending on the received device notifications, and a function to handle the button press and sending the message back to the device.

最佳答案

这不是 Cocoa 中初始化的工作方式。请阅读"Initialization"在 Cocoa 核心能力指南中。

当这个 init 方法运行时,你的对象已经被分配了。您不应该将 self 指针重新分配给另一个分配。

您的类应首先调用其父类(super class)的指定初始化器self = [super initWithWhatever:obj];,然后设置其自己的属性。

关于objective-c - 创建另一个类的实例的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14825601/

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