2011-11-26 69 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只会提供属性的自动完成。