嗨,我是Objective-C编程的新手。今天,我正在编写一个程序,但对它的行为方式很困惑。这是程序:

#import <Foundation/Foundation.h>
@interface MyClass:NSObject
{
    NSString * str;
}
@property NSString * str;
@end;

@implementation MyClass
@synthesize str;
@end

int main()
{   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc]init];
    MyClass * obj = [[MyClass alloc]init];
    [obj setStr: @"hello"];
    /* the following lines of code will give error if not commented but why it is
     resulting in error  ?????
      NSLog(@"Str = %@",[obj getStr]); // **gives error if not commented**
      **or**
      NSString * temp;
      temp = [obj getStr]; // gives error
      NSLog(@"%@",temp);
    */
    NSString * temp;
    temp = obj.str;
    NSLog(@"%@",temp); // works just fine
    [pool drain];
    return 0;
}


在主要功能中,当我尝试使用getStr合成访问器打印str值时,会给我错误。为什么这样?我们是否不允许对getter使用合成的NSString还是我没有以正确的方式使用getter?但是仍然由合成的setter [obj setStr]设置NSString类型的值。
我在这里和那里看到了关于堆栈溢出这类问题的一些答案,但是我真的不明白那里提供的答案,因此请以简单的方式为我解释一下。非常感谢。

最佳答案

属性xyz的合成吸气剂的名称与属性的名称相同,即xyz。不是getXyz。只有setter会以“ set”作为前缀,成为setXyz:

这就是为什么您的代码

NSLog(@"Str = %@",[obj getStr]);


不编译。更改为

NSLog(@"Str = %@",[obj str]);


将解决问题。

注意:当您让Xcode为您合成属性时,也会创建一个变量来“支持”该属性。除了属性str之外,您无需声明实例变量str

关于ios - 合成的 setter/getter 不适用于NSString类型的实例变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20970725/

10-11 16:13