目标C - 无法解决@ property / @ synthesize setter和getters的问题?

时间:2012-09-13 00:54:46

标签: objective-c ios

我知道这是一个新手问题,但我无法理解这个问题(或者真的,我无法让它工作)

所以我有我的.h

@interface
NSString *test;
@end;

@property NSString *test

和我的.m

...
@synthesize test;
...

但是我想要一个用于测试的自定义setter - 正确的语法是什么?

感谢

3 个答案:

答案 0 :(得分:3)

首先,如果您计划test,则无需声明变量@synthesize,但如果您这样做,则需要将其置于大括号中。

其次,属性的声明需要在界面内:

@interface {
    NSString *test;
}
@property (readwrite) NSString *test
@end;

最后,setter的语法是

-(void)setTest:(NSString*)test {
    ...
}

如果您选择覆盖getter,则约定为

-(NSString*)test {
    return test;
}

答案 1 :(得分:2)

使用定义

简单创建方法
- (void) setTest:(NSString*) new_value

当您尝试修改test属性的值时,将调用此方法(您可以根据其他属性名称进行更改)。

请记住,只有在尝试修改self.test(属性)时才会调用此方法 - 如果直接修改测试变量,则不会调用setTest。将非属性变量命名为其他内容(前面带有下划线_test是常见的)是一种很好的做法,并让您的syntize语句引用它:

@synthesize test = _test;

这将访问self.test获取_test的值,并修改self.test调用setTest方法。如果要覆盖getter,则具有定义

- (NSString*) test

答案 2 :(得分:2)

如果您的自定义设置器的方法名称与setTest:不同(假设属性名称为test),则可以使用以下命令指定设置器:

@property(readwrite,setter=setShokolokobangoshay:) NSString *test;

然后,如果你有:

object.test = @"SomeValue";

它会自动“翻译”为:

[object setShokolokobangoshay:@"SomeValue"];

否则,您可以简单地提供setTest:方法,它将自动用作属性的setter,即使您使用@synthesize指令(在这种情况下,@synthesize }指令只会实现一个getter)。