@property @synthesize @dynamic在xcode中的区别

时间:2011-11-26 13:51:15

标签: iphone objective-c xcode properties getter-setter

所以我想问的是

这是我的头文件

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;
}

我真的需要一个白痴指导因为这个原因我还不明白。两者都有效。我也在使用dealloc和viewDidUnload中的发布正确?提前谢谢

2 个答案:

答案 0 :(得分:2)

有关属性的信息,而不是权威指南:

@property的一个优点是,@synthesize使用@property创建处理保留和释放的setter和getter(如果适用),并使用或不使用ARC(稍作修改)。

属性不再需要声明其关联的ivars,它们将自动生成。

属性可以放在头文件(.h)中供公共使用,也可以放在类扩展中的实现文件(.m)中,供类中的私人使用。

@synthesize[self myIvar]语句与允许“点表示法”无关。 “点符号”可以被视为替代访问setter和getter的括号形式(实际上使用更为通用但使用最好限于getter / setter)。

self.myIvar相当于[self setMyIvar:myValue]self.myIvar = myValue相当于{{1}}。

点符号可用于非属性,例如NSStrings:myString.length工作正常,并且是合理可接受的用法。

点符号与属性无关,但Xcode仅为属性提供自动完成功能。

答案 1 :(得分:-2)

@property@synthesize提供getter和setter(访问器)方法,而不是你自己写出来。声明使用@property进行,并使用@synthesize实施。

因此,在主程序中创建新的类对象时(假设您的类名为MyClass MyClass.mMyClass.h),您可以访问字符串变量{{ 1}}使用点运算符。如果您的对象被称为myString,那么您可以使用NewObject访问主程序中的字符串。

您也可以使用它来设置字符串的值(即NewObject.MyString)。非常方便和省时。它们都有效,因为您正在从类中访问变量,因此您不需要设置访问器。

对于NewObject.MyString = OtherString,你还需要-(void)dealloc来释放超类的变量。您无需在[super dealloc]中发布MyString,因为您已在viewDidUnload方法中执行此操作。

当你在-(void)dealloc中分配内存时,你需要在-(void)viewDidLoad中释放它,但是你没有在这里,所以不需要它。