新Xcode中的@synthesize语句

时间:2013-05-16 15:23:21

标签: objective-c xcode

在我的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;
}

3 个答案:

答案 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