创建另一个类的实例的实例

时间:2013-02-12 04:51:45

标签: objective-c cocoa

我试图将我的一些“超级对象”分解为更易于管理的单一(或至少是有限的)责任类。

我遇到的一个问题是制作UIBarButtonItem的特定实例的对象。在课堂上,我现在首先定义一个UIButton,然后将所有作为该按钮图标的图像作为子视图(例如按钮代表对设备的访问/控制,我使用按钮图像来显示该设备的当前信号强度)。此按钮还从设备对象侦听NSNotifications以表示信号强度更改,或者设备是否断开连接。按下按钮会向设备发送消息以断开连接。所有这些代码现在作为RootViewController的属性完美地运行。但是,我想把它拉到自己的类中,因为按钮由几个类共享,它只是用不必要的方法使控制器混乱。

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

编辑和解决我的问题

MyClass目前是UIBarButtonItem的子类。但是,我不是试图像这样使用它:[[MyClass alloc] initWithCustomView:]。我希望[MyClass alloc] init]能够完全创建自定义视图 - 换句话说,这个类的全部内容是完全包含此按钮创建自身,管理其子视图以及采取适当操作所需的全部内容。当它被按下时。 (我可以使用像[MyClass setupButton]这样的公共方法和类型为UIBarButtonItem的公共属性轻松地使MyClass成为NSObject。但是,我觉得这看起来不对,因为那时类只是创建按钮,但它不是按钮本身。)

@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.

2 个答案:

答案 0 :(得分:1)

在我看来,您希望扩展UIBarButtonItem,而不是在init方法中创建它的实例。尝试更改类声明(在类的.h文件中):

@interface MyClass : NSObject

到此:

@interface MyClass : UIBarButtonItem

然后只需在self方法中返回init即可。将self设置为值通常是一个坏主意。

如果您不确定这里发生了什么,那么您正在创建一个UIBarButtonItem的子类。这使您的子类可以扩展超类的功能。如果你感到困惑,你应该看看面向对象语言中的子类/类继承,以了解发生了什么。 This guide记录了Objective-C中各类的工作原理。

答案 1 :(得分:1)

这不是Cocoa初始化的工作原理。请阅读Cocoa Core Competencies指南中的"Initialization"

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

您的班级应首先调用其超类的指定初始值设定项self = [super initWithWhatever:obj];,然后设置自己的属性。