Objective c 错误:访问未知的getter方法?

Objective c 错误:访问未知的getter方法?,objective-c,cocoa-touch,Objective C,Cocoa Touch,错误:访问未知的getter方法 谢谢 #import <Foundation/Foundation.h> @interface puppy : NSObject { int mack; int jack; } -(puppy *) waldo: (puppy *) f; -(void) setMack: (int) m; -(void) setJack: (int) j; @end ///////////////////////////////////////

错误:访问未知的getter方法

谢谢

#import <Foundation/Foundation.h>


@interface puppy : NSObject {
    int mack;
    int jack;
}
-(puppy *) waldo: (puppy *) f;
-(void) setMack: (int) m;
-(void) setJack: (int) j;
@end

///////////////////////////////////////////////////

#import "puppy.h"


@implementation puppy
-(void) setJack: (int) j{
    jack = j;
}

-(void) setMack: (int) m{
    mack = m;
}



-(puppy*) waldo: (puppy *) f{   

    return (f.jack + f.mack); // Error: <-- Accessing unknown "jack" getter method
                              // Error: <-- Accessing unknown "mack" getter method
}
当你做f.jack时,它被翻译成[f jack]。您需要将-intjack方法添加到接口中才能使其工作。也许措辞拙劣,我还意味着该方法需要实现。麦克的情况也是如此

但也就是说,点符号是表示属性的。这不合适


如果您为mack和jack定义了属性并合成了这些方法,那么就更容易了。

您还没有实现jack和mack的方法


但我建议只使用@property和@synthesis而不使用ivar。

您还没有为jack和mack指定getter方法。您可以为它们使用属性,而不是编写自己的getter/setter

@interface puppy : NSObject {
    int mack;
    int jack;
}
-(puppy *) waldo: (puppy *) f;

// use property
@property (nonatomic, assign) int mack;
@property (nonatomic, assign) int jack;
@end

@implementation puppy

@synthesize jack, mack;

-(puppy*) waldo: (puppy *) f{   
    return (f.jack + f.mack);
}

@end

现在不需要这些set方法。getter和setter都是为您合成的。如果在问题中没有被询问,您应该从方法waldo返回int

点表示法不仅仅用于属性。点符号和属性是完全正交的。虽然点表示法非常适用于setter和getter,但setter/getter可以是传统上声明的方法。同样,虽然@property是一种简洁声明getter/setter的方法,但不需要使用点语法来使用它们。这是为了指出waldo方法中明显的指针错误。请注意,您也可以删除ivar声明。
@interface puppy : NSObject {
    int mack;
    int jack;
}
-(puppy *) waldo: (puppy *) f;

// use property
@property (nonatomic, assign) int mack;
@property (nonatomic, assign) int jack;
@end

@implementation puppy

@synthesize jack, mack;

-(puppy*) waldo: (puppy *) f{   
    return (f.jack + f.mack);
}

@end