合成的getter不适用于NSString类型的变量

时间:2014-01-07 11:41:34

标签: ios objective-c nsstring getter synthesize

嗨,我是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;
}

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

3 个答案:

答案 0 :(得分:2)

属性xyz的合成getter的名称与属性的名称相同,即xyz。它不是 getXyz。只有setter以“set”为前缀,变为setXyz:

这就是你的代码

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

无法编译。改为

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

将解决问题。

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

答案 1 :(得分:0)

这不是getter方法调用temp = [obj getStr];。 Getter方法由[obj str])或点符号obj.str触发。但是如果你这样做,你可以定义getStr,然后像你一样使用。

答案 2 :(得分:0)

访问属性的getter和setter的另一种方法:

//getter
NSLog(@"Str = %@",self.str);

//setter
self.str = @"hello";