所以我想问的是
这是我的头文件
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中的发布正确?提前谢谢
答案 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.m
,MyClass.h
),您可以访问字符串变量{{ 1}}使用点运算符。如果您的对象被称为myString
,那么您可以使用NewObject
访问主程序中的字符串。
您也可以使用它来设置字符串的值(即NewObject.MyString
)。非常方便和省时。它们都有效,因为您正在从类中访问变量,因此您不需要设置访问器。
对于NewObject.MyString = OtherString
,你还需要-(void)dealloc
来释放超类的变量。您无需在[super dealloc]
中发布MyString
,因为您已在viewDidUnload
方法中执行此操作。
当你在-(void)dealloc
中分配内存时,你需要在-(void)viewDidLoad
中释放它,但是你没有在这里,所以不需要它。