为什么xcode会给我一个“找不到方法”的错误?

时间:2011-06-21 01:59:56

标签: iphone xcode methods call

我有一个名为Shot的对象,它是UIIMageView的子类。

//  Shot.h

#import <Foundation/Foundation.h>


@interface Shot : UIImageView {
    CGPoint position; 
}
- (void)SetShot:(CGPoint *)point;
@end


//  Shot.m


#import "Shot.h"


@implementation Shot

- (void)SetShot:(CGPoint *)point;
{
    position.x = point->x;
    position.y = point->y;

}

@end

当我尝试调用SetShot方法时,xcode会给我这个警告:

  

方法未找到-SetShot(返回类型默认为id)

这是电话:

//CustomImageView.m
#import "CustomImageView.h"

@class Shot;
@implementation CustomImageView

-(id) initWithCoder:(NSCoder *)aDecoder
{
    self.userInteractionEnabled = YES;
    return self;
}


-(void) setInteraction
{
    self.userInteractionEnabled = YES;
}


- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self];
    Shot *shot;

    [shot SetShot:point];

}

- (void)dealloc
{
    [super dealloc];
}
@end

当我运行程序时,调用该方法时会出现致命错误。那是为什么?

3 个答案:

答案 0 :(得分:5)

您的代码中存在三个问题。首先,您需要在CustomImageView.m实现文件中导入Shot.h:

#import "Shot.h"

而不是简单地向前声明Shot类:

@class Shot;

当编译器看到前向声明时,它会发现该类的存在,但还不知道它的属性,声明的属性或方法 - 特别是,它不知道Shot-SetPoint:实例方法。

其次,您创建Shot的实例:

Shot *shot;
[shot SetShot:point];

这只声明shot是指向Shot的指针,但没有分配/初始化。你应该创建一个对象,即:

Shot *shot = [[Shot alloc] init];

然后使用它:

[shot SetShot:point];

并且,当您不再需要它时,请将其释放:

[shot release];

虽然目前尚不清楚创建镜头,设置其点,然后释放它的好处是什么。除非你的代码是一个人为的例子,否则你可能想重新考虑这种行为。

此外,您的-SetPoint:方法有一个指向CGPoint参数的指针,但您传递的是CGPoint值(即非指针)参数:

// point is not a pointer!
CGPoint point = [touch locationInView:self];
Shot *shot;
[shot SetShot:point];

我建议你完全放弃指针,即:

- (void)SetShot:(CGPoint)point;
{
    position = point;    
}

并且可能使用declared property而不是手动实现的setter方法。

答案 1 :(得分:3)

待办事项

#import "Shot.h"

而不是:

@class Shot;

答案 2 :(得分:1)

您尚未创建Shot的实例;你只创建了一个指针:

Shot *shot;

您必须分配并初始化它:

Shot *shot = [[Shot alloc] init];

在某些时候,您还必须导入头文件Shot.h