2

我不熟悉同时具有属性和实例变量的程序语言。
所以我不知道使用属性和实例变量的好方法。

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

我需要使用实例变量吗?
还是仅使用属性是 Objective-C 的最佳实践?

@interface ViewController : UIViewController
{
    // instance variable
    @public
    int a;
}

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

@end
4

7 回答 7

8

变量和属性之间的基本区别在于,您可以为属性赋予属性。您不能为变量赋予任何属性。因此,如果您希望有任何特定的行为,例如保留变量、以原子方式访问它、在类之外访问,您应该选择属性。

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

于 2012-06-06T06:23:09.277 回答
5

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

  • 内存管理:在幕后它将创建一个设置器,该设置器创建具有正确 内存管理的变量。它将为您省去一些麻烦,因为您可以很容易地看到内存管理是如何完成的(strong/weakretain/ copy/ assign)。

  • 其他类的可访问性:如果你@property在 .h 中声明你的@synthesize,在 .m 中声明你的 ivar 将是公共可读和可写的。您可以使用 privat 类扩展来防止这种情况。您甚至可以声明一个@property公共并通过私有类扩展readonly在内部声明它们。readwrite例如:私有财产

   // [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,例如,您可以在 a@property更改后重新加载 tableview。

  • 自动键值观察 (KVO) 兼容:如果您使用或计划使用 KVO,您只需声明属性即可基本上免费获得它。没有其他事情需要做!

  • 点表示法:如果你有@property.

   self.myIvar = (id) someThing; 
   [array addObject:self.myIvar];
  • 如果您需要公开 iVar,那么编写一个@property比为 iVar 编写 getter 和 setter更简单

  • 使用 a@property您无需在 iVar 中声明(在 iOS 和 64 位 Mac Os X 应用程序中)。您可以通过以下方式进行@synthesize

    @synthesize myiVar = _myIvar;
于 2012-06-06T06:39:47.027 回答
4

到处使用属性。甚至不声明实例变量,而是像这样合成它们:@synthesize myProperty = _myProperty为了将它们与属性名称区分开来。属性也是处理内存管理的好方法。唯一必须使用合成实例变量的地方是dealloc方法中。
属性的优点有很多:
- 访问器方法定义了如何获取和设置实例变量的值。
- 您可以自定义访问器方法(例如,延迟实例化 ivar 或在设置新值时执行某些操作,例如setNeedsDisplay.
- 在设置新值时您无需处理内存管理 - 设置器负责释放/保留(取决于您如何声明该属性- retain//copyassign/ strong。- 一些带有/属性
的多线程东西-使用属性时 ,您可以利用 , .atomicnonatomic
KVO

于 2012-06-06T06:22:17.453 回答
2

A@property是一个实例变量,它应用了一些语义糖,以帮助将其暴露给外界(通常),并帮助避免编写样板代码来获取和设置它。

于 2012-06-06T06:19:45.640 回答
0

虽然属性通常是在您需要访问类之外的某个变量时创建的,意思是 getter n setter,但在目标 C 中,另一个需要创建属性是内存管理在编译器结束时进行,所以如果您使用的是某个对象,而不是原始数据类型,那么你应该使用属性并合成它,如果你使用手动引用计数,然后在 dealloc 中释放。但同样的主要目标是使其属性访问类外部的一些 iVar,例如将参数从一个类传递到另一个类等。

于 2012-06-06T06:19:21.007 回答
0

如果您@synthesize@property,您将可以访问 get 和 set 方法,这非常方便。如果 setter 是非原子的或原子的并且是只读的,您还可以定义 setter 的行为方式(保留、分配、复制)。如果你没有指定任何东西(也就是你没有合成属性),默认情况下 ivar 在类之外是不可见的,但你可以通过使用@public. 从逻辑上讲,您也可以将它们定义为@private@protected

通常我@synthesize@property因为我想从类外部访问 ivar,也因为我想要一个 getter 和 setter 方法。

于 2012-06-06T06:21:36.447 回答
0

一般的意见是,您应该尽可能使用属性。如果您仍有疑问,以下是 Apple 的建议:

通常,即使您从对象自己的实现中访问对象的属性,您也应该使用访问器方法或点语法进行属性访问,在这种情况下,您应该使用self.

...

此规则的例外是在编写初始化、释放或自定义访问器方法时

...

您应该始终直接从初始化方法中访问实例变量,因为在设置属性时,对象的其余部分可能尚未完全初始化

在此处阅读整个文档,以更好地理解该主题。

至于性能问题,对于大多数应用程序来说,收益是微不足道的。阅读内容以获得非常详细的说明。

于 2015-08-20T13:23:13.890 回答