在我的Xcode项目中,我不需要@synthesize,在这种情况下如何设置其值? Xcode错误说这是一个未声明的属性。 当然我不能在setter中使用self.someString而且我没有_someString。 那么该怎么办?
MyClass.h
@property (nonatomic, strong, getter = getterMethodName, setter = setterMethodName:) NSString *someString;
Myclass.m
//SETTER
- (void) setSomeString:(NSString *) newString
{
someString = newString;
}
- (NSString) someString
{
return self.someString;
}
答案 0 :(得分:2)
我不确定我理解这个问题?
您不再需要该行
@synthesize someString = _someString;
你仍然可以做这些事情:
self.someString = @"Hello";
或
_someString = @"goodbye";
你甚至可以覆盖setter和getter
- (void)setSomeString:(NSString *)someString {
if (_someString != someString) {
_someString = someString;
}
}
字面上唯一的变化就是你不需要合成线。其他一切都完全一样。
答案 1 :(得分:2)
你是对的,因为你不再需要合成属性。
但是,有一点需要注意。
如果您同时覆盖getter AND setter,那么您需要合成它。
将此添加到您的代码中......
@synthesize someString = _someString;
并改变你的getter和setter ......
- (void)setSomeString:(NSString *)newString
{
_someString = newString;
}
- (NSString *)someString
{
return _someString;
}
答案 2 :(得分:-1)
啊,好的,我知道这里发生了什么。
@synthesize是编译器为你创建一个getter和setter的指令,为了能够做到这一点,它创建了一个实例变量_someString。
在最新版本的LLVM中,@synthesize成为可选项。如果您不自己动手,LLVM会为您生成getter和setter。
但它只生成_someString实例变量,如果它生成getter或setter。
您同时指定了getter和setter,因此LLVM不会生成任何内容,包括_someString。
如果同时声明getter和setter,则必须自己定义值的存储方式。如果你想拥有一个_someString,你必须自己声明它。
@interface MyClass : NSObject {
NSString* _someString;
}
@property (nonatomic, strong, getter = getterMethodName, setter = setterMethodName:) NSString *someString;
@end