在合成属性方面我有点困惑。
假设我在* .h文件中有此属性。
@property (nonatomic, retain) NSString *aString;
在我的* .m文件中我合成了它。 @synthesize aString;
我知道当我使用synthesize时,编译器将生成setter和getter。但这些孵化器和吸气器是怎样的呢?
当我给aString一个值时,哪些方法是正确的?
self.aString = @"My New String"; // This will use the setter?
aString = @"My new String"; //This will not use the setter and retain the string, right?
aString = [@"My new string" retain]; //This will not use the setter, but it will retain the string ?
[self setAString:@"My new string"]; //This will also use the setter?
提前致谢!
答案 0 :(得分:5)
当你这样做时:
@property (nonatomic, retain) NSString *aString;
......接着是:
@synthesize aString;
......你的班级有三个基本的东西:
aString
的实例变量,您可以直接在您的班级中引用。- (NSString*) aString;
的getter函数,用于返回实例变量。- (void) setAString: (NSString*) value;
的setter函数,该函数保留传入的参数并将其分配给实例变量(并释放任何先前保留的值,如果存在); 实施方面,这些生成的方法和字段可能如下所示:
//in the .h file
@interface MyClass {
NSString* aString;
}
- (NSString*) aString;
- (void) setAString: (NSString*) value;
@end
//in the .m file
@implementation MyClass
- (NSString*) aString {
return aString;
}
- (void) setAString: (NSString*) value {
if (aString != value) {
[aString release];
aString = [value retain];
}
}
@end
所以回答你的其余问题:
self.aString = @"My New String"; // This will use the setter? Yes, and it will retain the string.
aString = @"My new String"; //This will not use the setter and retain the string, right? Right.
aString = [@"My new string" retain]; //This will not use the setter, but it will retain the string? Right again.
[self setAString:@"My new string"]; //This will also use the setter? Yep.
至于哪些是正确的,它们都是,取决于你想要什么,并假设你理解使用每一个之间的行为有何不同,特别是在释放/保留属性值方面。例如,此代码将泄漏内存:
self.aString = @"Value 1"; //go through the setter, which retains the string
aString = @"Value 2"; //bypass the setter, the 'Value 1' string will not be released
...而且这个等效代码不会:
self.aString = @"Value 1"; //go through the setter, which retains the string
self.aString = @"Value 2"; //go through the setter again to release the first string
答案 1 :(得分:2)
当您使用“dot”语法(例如self.aString
,self.aString = ...
)或消息语法(例如[self aString]
,[self setAString:...]
)时,会使用getter和setter。
直接分配给支持变量(在您的情况下有点混淆地命名为aString
)将不使用合成方法。要更改支持变量的名称,请在接口中将其声明为私有变量(在.h中):
NSString *aString_;
然后合成它:
@synthesize aString = aString_;
这将使用aString_
作为您的媒体资源的支持变量,因此您可以使用aString_
直接引用您的媒体资源的存储空间。
答案 2 :(得分:0)
关于代码的外观,请查看this question。
关于哪些行使用getter / setter:只有第1行和第4行。
self.aString = @"My New String";
[self setAString:@"My new string"];
答案 3 :(得分:0)
以下是正确的二传手。
self.aString = @"My New String";
[self setAString:@"My new string"];