用[self performSelector:@selector]调用NSObject超类方法?

时间:2012-10-16 14:36:34

标签: objective-c xcode methods

我有一个NSObject的子类,我想在其中调用IMMEDIATELY(一种 - (void)viewDidLoad)一个方法(在这种情况下加载一个MkMapView):有什么更好的方法呢?我想我不能使用viewDidLoad,所以我可以使用performSelector吗?

SubClass.h

@interface Mysubclass : NSObject <MKMapViewDelegate> {
}

SubClass.m(第一选择)

-(id)init{
 self = [super init];
 if ( self != nil ) {
 // THE CODE TO INITIALIZE MKMAPVIEW
}
return self
}

OR SubClass.m(第二种选择)

-(id)init{
 [self performSelector:@selector(myMethod)];
 return self;
}

-myMethod{
 // THE CODE TO INITIALIZE MKMAPVIEW
}

有什么更好(或更正确)的选择?有可能避免 - (id)init吗?或者每次我添加一个子类,调用一个方法我必须把它写入 - (id)init?谢谢!

1 个答案:

答案 0 :(得分:2)

在此上下文中没有理由使用-performSelector:。如果要在创建对象时添加初始化MKMapView的方法,请从if (self)块中调用该方法:

- (id)init
{
    self = [super init];
    if (self) {
        [self setupMapView];
    }
    return self;
}

- (void)setupMapView
{
    // THE CODE TO INITIALIZE MKMAPVIEW
}

这是个人偏好/风格的问题,是否要使用第二种方法-setupMapView,或者只是留下用于在MKMapView if (self)块中设置-init的代码1}}方法或将代码分解为从-setupMapView调用的第二个方法-init

话虽如此,听起来其他事情可能会因您的设置而关闭。你的MKMapView [很可能]应该在UIViewController子类中(可能有一个关联的XIB),这样你就可以访问-viewDidLoad。请注意,您的UIViewController子类将作为MKMapView的代理人。

更新1

在您的UIViewController子类实例中(我假设您将其称为ViewController,您应该IBOutletMKMapView个对象。请在{{1}中执行此操作通过(1)添加实例变量

ViewController.h

或通过(2)添加属性

@interface ViewController : UIViewController
{
    IBOutlet MKMapView *myMap;
}
@end

现在在Interface Builder中打开@interface ViewController : UIViewController @property (nonatomic, strong, readwrite) IBOutlet MKMapView *myMap; @end 。您应该在视图中有ViewController.xib。如果您还没有,请从对象库中添加一个。右键单击MKMapView。找到包含项File's Owner的行。从行右端的圆圈拖动到可见视图中的myMap

您的MKMapView班级现在有ViewController的出口。加载后,您将能够向视图控制器视图的MKMapView子视图发送消息。

您应该拥有MKMapView实例的属性或实例变量,以便在SubClass返回后不会销毁它。通过向-viewDidLoad

添加实例变量再次执行此操作
ViewController.h

或添加属性

@interface ViewController : UIViewController
{
    IBOutlet MKMapView *myMap;
    SubClass *istance;
}
@end

现在,在@interface ViewController : UIViewController @property (nonatomic, strong, readwrite) IBOutlet MKMapView *myMap; @property (nonatomic, strong, readwrite) SubClass *istance; @end 中,您需要定义ViewController.m,以便将-viewDidLoad设置为self.istance的委托。在评论中,我建议您创建自己的初始值设定项self.myMap。如果您计划-initWithMapView:SubClass进行广泛的设置,那么这是有道理的。如果您只想让MKMapView成为SubClass的代表,则不需要这样的方法。

让我们考虑两种情况:

(1)使用方法MKMapView

您将-[SubClass initWithMapView:]ViewController.m内的@implementation

ViewController

您将- (void)viewDidLoad { self.istance = [[SubClass alloc] initWithMapView:self.myMap]; } SubClass.h内的@interface

SubClass

您将- (id)initWithMapView:(MKMapView *)mapView; @property (nonatomic, weak, readwrite) MKMapView *mapView; SubClass.m内的@implementation

SubClass

(2)使用- (id)initWithMapView:(MKMapView *)mapView { self = [super init]; if (self) { self.mapView = mapView; self.mapView.delegate = self; //more setup of mapView. } return self; }

相反,在-[SubClass init]中你会有

ViewController.m
相关问题