Почему xcode выдает ошибку «метод не найден»? - PullRequest
0 голосов
/ 21 июня 2011

У меня есть объект с именем 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 выдает мне это предупреждение:

method -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 ]

5 голосов
/ 21 июня 2011

В вашем коде три проблемы.Во-первых, вам нужно импортировать Shot.h в ваш файл реализации CustomImageView.m:

#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;    
}

и, возможно, использовать объявленное свойство вместо вручнуюреализован метод сеттера.

3 голосов
/ 21 июня 2011

Do

#import "Shot.h"

вместо:

@class Shot;
1 голос
/ 21 июня 2011

Вы не создали экземпляр Shot; Вы только что создали указатель с:

Shot *shot;

Вы должны выделить и инициализировать его:

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

В какой-то момент вы также должны импортировать заголовочный файл Shot.h.

...