2014-01-07 74 views
0

嗨,我是Objective-C編程的新手。今天我正在編寫一個程序,我對它的行爲方式感到困惑。下面是程序:合成的getter不能用於NSString類型的實例變量

#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值。爲什麼這樣?我們是否被允許爲NSString使用合成getter或者我沒有以正確的方式使用getter?但仍然合成的setter[obj setStr]設置NSString類型的值。 我在這裏和那裏看到了關於堆棧溢出的這類問題的一些答案,但我真的不知道在那裏提供的答案,所以請以簡單的方式爲我解釋這個問題。非常感謝。

回答

2

屬性xyz的合成吸氣劑的名稱與該屬性的名稱相同,即xyz。它是而不是getXyz。只有二​​傳手被以「set」爲前綴,成爲setXyz:

這就是爲什麼你的代碼

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

不能編譯。更改爲

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

將解決該問題。

注意:當您讓Xcode爲您合成一個屬性時,還會創建一個用於「返回」該屬性的變量。除了屬性str之外,您不需要聲明實例變量str

+0

TNX很多。我不知道屬性xyz的合成getter的名稱與屬性的名稱相同。日Thnx。 – iamyogish

0

這不是吸氣方法調用temp = [obj getStr];。 Getter方法由[obj str])或點符號obj.str觸發。但是,如果你這樣做,你可以定義getStr,然後像你一樣使用。

+0

tnx我明白了:) – iamyogish

0

另一種方式來訪問屬性的getter和setter:

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

//setter 
self.str = @"hello"; 
相關問題