为 iOS 应用程序启用 ARC 后,如果我希望一个类具有私有值/对象,最好声明这一点:
// .m file
@interface MyClass ()
@property (strong, nonatomic) NSString *name;
@end
或这个?:
@implementation MyClass
{
NSString *name;
}
我应该有哪些内存管理注意事项?
谢谢!
为 iOS 应用程序启用 ARC 后,如果我希望一个类具有私有值/对象,最好声明这一点:
// .m file
@interface MyClass ()
@property (strong, nonatomic) NSString *name;
@end
或这个?:
@implementation MyClass
{
NSString *name;
}
我应该有哪些内存管理注意事项?
谢谢!
您可以使用任何一种方法。在第一种情况下,您要声明私有财产——这有一些好处。例如,您可以在其他地方(例如:在单元测试中)公开该私有接口并访问您的一些类的内部。另外,作为一个属性,您可以控制指针是弱还是强。在第二种情况下,您正在为您的类声明一个 ivar(实例变量),它只能从您的类的方法中访问。
您应该始终使用属性。我知道使用 ARC 使用 ivar 似乎等于使用属性,但事实并非如此!!!!
属性有很多选择,其中一个非常重要的是原子/非原子。引用堆栈上的另一个答案:
使用“原子”,合成的 setter/getter 将确保始终从 getter 返回整个值或由 setter 设置,而不管任何其他线程上的 setter 活动。也就是说,如果线程 A 在 getter 的中间,而线程 B 调用 setter,则实际可行的值——很可能是一个自动释放的对象——将返回给 A 中的调用者。
另一个真正重要的是copy
,如果您复制一个对象,您可以确定(几乎)该对象在您传入时没有更改。
我也喜欢属性,因为它们是方法,你可以覆盖它们。有时,当我编写 GUI 元素时,我喜欢只公开像“文本”这样的属性。使用覆盖设置器,您可以将“文本”直接传递给它应该显示的标签或文本字段。
属性给你带来了很多好处,因为新版本的 Xcode 会自动创建 ivar。