当我第一次学习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语句的实际示例是什么?
答案 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将在编译时自动添加。