为什么要使用@synthesize语句

时间:2015-04-29 10:34:28

标签: ios objective-c properties

当我第一次学习iOS编程时(我相信这是来自ARC斯坦福大学前的讲座),我们总是合成这样的属性:

$.ajax({
    url: "http://test.be",
    type: "POST",
    dataType: "xml",
    data: soapMessage3,
    crossDomain: true,
    contentType: "text/xml; charset=\"UTF-8\"",
    processdata: false,
    success: function (xml) {
        $(xml).find('item').each(function () {
            var url = $(this).find("value:contains('/photovit_action')").text();
            alert(url);

            $('#test').append('<img src="http://test.be/' + url + 'canvasH(180)W(186)">');
        });
    }
});

然而,似乎这已经是default behaviour了一段时间。因此,省略此语句与将其保留完全相同。

我的问题是:鉴于此默认行为,我们实际上想要使用@synthesize语句的实际示例是什么?

3 个答案:

答案 0 :(得分:6)

对于iOS 6,LLVM编译器带有一种称为“属性自动合成”的东西。基本上,这意味着编译器将为它看到的每个@synthesize添加@property,如下所示:

@synthesize propertyName = _propertyName;

也就是说,它将创建一个前缀为下划线的ivar,它将生成吸气剂和放大器。使用这个ivar的setter。

明确使用@synthesize只有一个原因,原因是重命名ivar,或者,例如,对两个不同的属性使用相同的ivar。

另请注意,在某些情况下,您需要使用@dynamic来阻止合成。通常当你知道方法(getter或setter)已在某处定义但编译器不知道它们时。

自动合成没有记忆含义,所以它根本没有连接到ARC。

  

如果我手动实现getter和setter怎么办?

如果属性是readwrite并且你实现了setter和getter,或者如果属性是readonly并且你实现了getter,那么什么都不会被合成。合成是指两种方法的自动定义。为什么编译器应该合成已存在的东西?如果手动实现需要ivar,只需声明ivar,您不需要添加@synthesize只是为了添加一个ivar(尽管你可以)。

修改

我忘记了使用@synthesize时需要的一个原因,那就是实现协议中声明的属性。这样的属性不会被自动合成。一个典型的例子是[UIApplicationDelegate window]

答案 1 :(得分:2)

你不必使用它。 只需在.h:

中声明您的公共属性
@property (nonatomic, strong/weak/assign) MyType *propertyName;

有关ARC here

的更多详细信息

附加说明:
@synthesize用于将属性与内部类变量相关联。它是使用ARC自动完成的。

答案 2 :(得分:2)

在objective-c中的@synthesize只实现属性设置器和getter:

- (void)setCoolWord:(NSString *)coolWord {
     _coolWord = coolWord;
}

- (NSString *)coolWord {
    return _coolWord;
}

Xcode 4确实为您实现了这一点(iOS6需要Xcode 4)。从技术上讲,它实现了@synthesize coolWord = _coolWord(_coolWord是实例变量,coolWord是属性)。

要访问这些属性,请使用self.coolWord来设置self.coolWord = @&#34; YEAH!&#34 ;;得到NSLog(@"%@", self.coolWord);

另请注意,setter和getter仍然可以手动实现。如果你实现了setter和getter,你需要手动包含@synthesize coolWord = _coolWord;

在iOS6中进行自动合成,不再需要专门声明支持ivars或编写@synthesize语句。当编译器找到@property语句时,它将使用我们刚刚审查的指南代表我们做这两种情况。所以我们需要做的就是声明这样的属性:

@property (nonatomic, strong) NSString *abc;

在iOS 6中,@ synthesize abc = _abc将在编译时自动添加。