-7

在我的 Xcode 项目中,我不需要 @synthesize,在这种情况下,我该如何设置它的值?Xcode 错误说这是一个未声明的属性。当然,我不能在 setter 中使用 self.someString,而且我没有 _someString。那么该怎么办?

我的类.h

@property (nonatomic, strong, getter = getterMethodName, setter = setterMethodName:) NSString *someString;

我的班级.m

//SETTER
- (void) setSomeString:(NSString *) newString
{
  someString = newString;
}

- (NSString) someString
{
  return self.someString;
}
4

3 回答 3

2

您是正确的,因为您不再需要合成属性。

但是,有一个警告。

如果您同时覆盖 getter 和 setter,那么您确实需要合成它。

将此添加到您的代码中...

@synthesize someString = _someString;

并像这样改变你的getter和setter......

- (void)setSomeString:(NSString *)newString
{
  _someString = newString;
}

- (NSString *)someString
{
  return _someString;
}
于 2013-05-16T16:38:36.063 回答
2

我不确定我是否理解这个问题?

你不再需要这条线

@synthesize someString = _someString;

你仍然可以做这些事情:

self.someString = @"Hello";

或者

_someString = @"goodbye";

你甚至可以覆盖 setter 和 getter

- (void)setSomeString:(NSString *)someString {
    if (_someString != someString) {
        _someString = someString;
    }
}

从字面上看,唯一的变化是您不需要合成线。其他一切都完全相同。

于 2013-05-16T15:26:16.637 回答
-1

啊,好的,我知道这里发生了什么。

@synthesize 是编译器为您创建 getter 和 setter 的指令,为了能够完成它的工作,它创建了一个实例变量 _someString。

在 LLVM 的最新版本中,@synthesize 成为可选的。LLVM 为你生成 getter 和 setter,如果你不自己做的话。

但它仅在生成 getter 或 setter 时才会生成 _someString 实例变量。

您同时指定了 getter 和 setter,因此 LLVM 不会生成任何内容,包括 _someString。

如果同时声明 getter 和 setter,则必须自己定义值的存储方式。如果你想要一个 _someString 你必须自己声明它。

@interface MyClass : NSObject {
    NSString* _someString;
}

@property (nonatomic, strong, getter = getterMethodName, setter = setterMethodName:) NSString *someString;

@end
于 2013-05-16T16:28:39.013 回答