使用@synthesize时使用哪种方法是正确的

时间:2011-05-03 13:03:21

标签: iphone ios4

在合成属性方面我有点困惑。

假设我在* .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?

提前致谢!

4 个答案:

答案 0 :(得分:5)

当你这样做时:

@property (nonatomic, retain) NSString *aString;

......接着是:

@synthesize aString;

......你的班级有三个基本的东西:

  1. 一个名为aString的实例变量,您可以直接在您的班级中引用。
  2. 具有签名- (NSString*) aString;的getter函数,用于返回实例变量。
  3. 具有签名- (void) setAString: (NSString*) value;的setter函数,该函数保留传入的参数并将其分配给实例变量(并释放任何先前保留的值,如果存在);
  4. 实施方面,这些生成的方法和字段可能如下所示:

    //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.aStringself.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"];