2011-11-26 71 views
2

所以我想問的是低於@property @synthesize @dynamic差異在Xcode

這裏是我的頭文件

NSString *myString; 

在M。文件

-(void)someMethod{ 
    myString = [NSString stringWithString = @"Hello"]; 
    NSLog(@"%@",myString); 
} 

-(void)dealloc{ 
    [myString release]; 
} 
-(void)viewDidUnload{ 
    [myString release]; 
    myString=nil; 
} 

現在確定其他情況

在我的頭文件

NSString *myString; 
@property (nonatomic,retain) NSString *myString; 

在M。文件

@synthesize myString; 

-(void)someMethod{ 
    NSString *tempString = [[NSString alloc] initWithString:@"Hello"]; 
    self.myString = tempString; 
    [tempString release]; 
    NSLog(@"%@",myString); 
} 

-(void)dealloc{ 
    [myString release]; 
} 
-(void)viewDidUnload{ 
    [myString release]; 
    self.myString=nil; 
} 

我真的需要這個,因爲我不understant它尚未白癡指南。兩者都有效。也是我使用釋放dealloc和viewDidUnload正確??預先感謝

回答

-2

@property@synthesize提供了getter和setter(訪問器)方法,而不是你自己寫出來。該聲明使用@property進行,並與@synthesize一起執行。

所以在主程序中,當你創建一個新的類對象(假設你的類被稱爲MyClassMyClass.mMyClass.h),您就可以使用點運算符來訪問字符串變量myString。如果您的對象名爲NewObject,那麼您可以使用NewObject.MyString訪問主程序中的字符串。

您也可以使用它設置字符串的值(即NewObject.MyString = OtherString)。非常方便和省時。它們都工作,因爲你正在訪問類中的變量,所以你不需要設置訪問器。

對於-(void)dealloc您還需要[super dealloc]以釋放超類的變量。您不需要在viewDidUnload中發佈MyString,如您在-(void)dealloc方法中所做的那樣。

當您在-(void)viewDidLoad中分配內存時,則需要在-(void)viewDidUnload中釋放它,但是您不在此處,因此不需要它。

+0

'@ property'和'@ synthesize'語句與允許「點符號」無關。 「點符號」可以被看作是替代訪問setter和getters的括號形式(實際上使用更普遍,但最好限制getter/setter使用)。 '[self myIvar]'相當於'self.myIvar',[self setMyIvar:myValue]'相當於'self.myIvar = myValue'。 'dot notation'可以用於非屬性,比如'NSString's:'myString.length'可以正常工作,並且是合理可接受的用法。 – zaph

+0

不知道,謝謝! – sooper

+0

@CocoaFu我想我從來沒有意識到NSString沒有一個名爲'length'的屬性,如果是的話,那麼點符號是如何工作的?這可能是非常有趣的,如果一個人可以實現它爲自己的類... –

2

信息有關的屬性,而不是一個明確的指導:

一個優勢的@property是與@synthesize他們創造制定者和處理保留getter和釋放(如適用)和帶或不帶AR​​C的工作(含有少量修改)。

屬性不再需要聲明其關聯的ivars,它們將自動生成。

屬性可以放在頭文件(.h)中供公共使用,也可以放在類擴展中的實現文件(.m)中用於類中的私有用途。

@property@synthesize聲明與允許「點符號」無關。「點符號」可以被看作是替代訪問setter和getters的括號形式(實際上使用更普遍,但最好限制getter/setter使用)。

[self myIvar]相當於self.myIvar[self setMyIvar:myValue]相當於self.myIvar = myValue

點符號可用於非屬性,如NSStrings:myString.length工作正常,並且是合理可接受的用法。

點符號與屬性無關,但Xcode只會提供屬性的自動完成。