我有一个名为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
当我运行程序时,调用该方法时会出现致命错误。那是为什么?
答案 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
。