为了账号安全,请及时绑定邮箱和手机立即绑定

Objective-c中的“实例变量”和“属性”之间有区别吗?

Objective-c中的“实例变量”和“属性”之间有区别吗?

iOS
一只名叫tom的猫 2019-07-24 10:05:02
Objective-c中的“实例变量”和“属性”之间有区别吗?Objective-c中的“实例变量”和“属性”之间有区别吗?我对此不太确定。我认为“属性”是一个具有存取方法的实例变量,但我可能认为错了。
查看完整描述

3 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

属性是一种为某些值实现getter / setter的友好方式,具有其他有用的功能和语法。属性可以由实例变量支持,但是您也可以定义getter / setter以执行更动态的操作,例如,您可以在字符串上定义lowerCase属性,该属性动态创建结果而不是返回某个成员的值变量。

这是一个例子:

// === In your .h ===@interface MyObject {
    NSString *propertyName;}// ...@property (nonatomic, retain) NSString *propertyName;// === In your .m @implementation ===@synthesize propertyName /* = otherVarName */;

@property行定义了一个名为propertyNametype 的属性NSString *。可以使用以下语法获取/设置:

myObject.propertyName = @"Hello World!";NSLog("Value: %@", myObject.propertyName);

当您分配或读取时,myObject.propertyName实际上是在对象上调用setter / getter方法。

@synthesize行告诉编译器为您生成这些getter / setter,使用具有相同属性名称的成员变量来存储值(或者otherVarName如果您在注释中使用语法)。

随着@synthesize你仍然可以定义自己的重载的getter / setter方法之一。这些方法的命名约定是setPropertyName:针对getter的setter和propertyName(或getPropertyName非标准)。另一个仍将为您生成。

在您的@property行中,您可以在属性的parens中定义许多属性,这些属性可以自动执行线程安全和内存管理等操作。默认情况下,属性是原子的,这意味着编译器将@synthesiz使用适当的锁包装ed get / set调用以防止并发问题。您可以指定nonatomic要禁用此属性的属性(例如,在要将大多数属性设置为默认的iPhone上nonatomic)。

有3个属性值可以控制任何@synthesizedsetter的内存管理。第一个是retain自动发送release到属性的旧值和retain新值。这非常有用。

第二个是copy复制传入的任何值,而不是保留它们。最好使用copyNSString,因为调用者可以传入NSMutableString并将其从您下面更改。copy将创建只有您有权访问的输入的新副本。

第三种是assign直接指针分配而不调用旧对象或新对象上的保留/释放。

最后,您还可以使用该readonly属性禁用该属性的setter。


查看完整回答
反对 回复 2019-07-24
?
长风秋雁

TA贡献1757条经验 获得超7个赞

我使用接口部分的属性 - 对象与其他对象和实例变量的接口是你在课堂上需要的东西 - 除了你应该看到并操纵那些东西。


查看完整回答
反对 回复 2019-07-24
  • 3 回答
  • 0 关注
  • 330 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信