首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Objective-C中,什么时候应该使用属性,什么时候应该使用实例变量?

在Objective-C中,什么时候应该使用属性,什么时候应该使用实例变量?
EN

Stack Overflow用户
提问于 2012-06-06 14:15:53
回答 7查看 3.9K关注 0票数 2

我不熟悉既有属性变量又有实例变量的编程语言。

所以我不知道使用属性和实例变量的好方法。

现在,我只在Objective-C代码中使用属性,而不使用任何实例变量。

我需要使用实例变量吗?

或者只使用属性是Objective-C的最佳实践?

代码语言:javascript
复制
@interface ViewController : UIViewController
{
    // instance variable
    @public
    int a;
}

// property
@property(nonatomic, strong) NSString *b;

@end
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-06-06 14:22:17

在任何地方使用属性。甚至不要声明实例变量,而是像这样合成它们:@synthesize myProperty = _myProperty,以便将它们与属性名区分开来。属性也是处理内存管理的好方法。唯一必须使用合成实例变量的地方是dealloc方法。

这些属性的优点很多:

取值方法定义如何获取和设置实例变量的值。取值方法您可以自定义取值方法(例如,延迟实例化

  • 或在设置新值时执行某些操作,如设置新值时不处理内存管理-
  • 负责释放/保留(取决于您如何使用atomic/nonatomic声明属性attributes
  • You可以利用KVO,当使用properties
  • And最少,但不是最后时-如果您担心每次调用getter或setter时都会出现性能问题……
票数 4
EN

Stack Overflow用户

发布于 2012-06-06 14:23:09

变量和属性之间的基本区别在于,您可以为属性赋予属性。你不能给变量赋予任何属性。因此,如果你希望有任何特定的行为,比如保留变量,原子地访问它,在类之外进行访问,你应该去寻找属性。

如果您只是想在类中使用访问变量,并且该变量没有附加任何特殊行为,则不需要通过属性访问它。你可以直接使用变量本身。这也将提高性能。

票数 8
EN

Stack Overflow用户

发布于 2012-06-06 14:39:47

与ivar相比,@property有一些优势:

  • 内存管理:在后台,它将创建一个setter,该setter使用正确的内存管理创建变量。因为您可以很容易地看到内存管理是如何完成的(strong/weakretain/copy/assign). ),所以它将为您省去一些麻烦其他类的
  • 可访问性:如果您在.h中声明@property并在.m中对其执行@synthesize操作,则您的ivar将是公共的可读写的。您可以使用privat类扩展来防止这种情况。您甚至可以声明一个@property公共readonly,并通过privat类扩展在内部声明它们为readwrite。例如:A private property

代码语言:javascript
复制
   // [In the implementation file]  
   @interface MyClass ()  
   @property (nonatomic, retain) NSMutableArray* someData; // private!!   
   @end  

   @implementation MyClass @synthesize someData   
   @end

  • 自定义getter和setter:如果您愿意,您仍然可以编写自定义的getter和setter,甚至可以只编写一个getter或setter,并让另一个自动@synthesize。你可以编写自定义逻辑到这样的getter和setter中,例如,你可以在一个KVO兼容changed.
  • Automatic键值观察(KVO)之后重新加载一个表视图:如果你使用或计划使用KVO,你只需声明属性就可以免费获得它。
  • 点符号:如果你有@property,你可以通过点符号访问getter和setter。

代码语言:javascript
复制
   self.myIvar = (id) someThing; 
   [array addObject:self.myIvar];

  • 如果你需要你的iVar是公开的,那么写一个@property比写一个iVar
  • 的getter和setter要简单得多,这个@property你不需要在iVar中声明(在iOS和64位Mac应用程序中)。您可以通过@synthesize

完成此操作

代码语言:javascript
复制
    @synthesize myiVar = _myIvar;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10909039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档