0

嗨,我是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类型的值。我在这里和那里看到了一些关于堆栈溢出问题的答案,但我真的不明白那里提供的答案,所以请用简单的方式为我解释一下。非常感谢。

4

3 回答 3

2

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

这就是为什么你的代码

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

不编译。更改为

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

将解决问题。

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

于 2014-01-07T11:44:36.337 回答
0

这不是 getter 方法调用temp = [obj getStr];。Getter 方法由[obj str])or 或 dot notation触发obj.str。但是您可以定义getStr,如果您这样做,则照常使用。

于 2014-01-07T11:46:17.507 回答
0

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

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

//setter
self.str = @"hello";
于 2014-01-07T11:49:44.297 回答