0

在 .h 或 .m 文件中声明 @property 有什么区别

@property (nonatomic, readwrite, assign) BOOL notificationDidLaunch;

它与变量的范围有关吗?

同样在 .h 文件中,像这样用括号声明字符串有什么区别

@interface AppDelegate : NSObject < UIApplicationDelegate > {
    NSString *hat;
}

并像下面那样在他们之外做

@property (nonatomic, strong) NSString *hat;
4

2 回答 2

2

总结说明

@property.m 中的A对类是私有的,而 .h 中的 A 是公共的。

声明在括号内或不带括号之间的区别在于变量的含义。

在括号内,您声明了一个实例变量(或 ivar),该变量只能由您的类的实例访问。属性(在 .h 中声明)意味着任何类都可以访问。

特性

A@property本质上定义了可以覆盖的集合和获取。当你这样做时:

AppDelegate myAppDelegate;
myAppDelegate.hat = @"A hat": 

你本质上是在做:

[myAppDelegate setHat:@"A hat"]

当你这样做时

myAppDelegate.hat //so you can get the property's value

你本质上是在做

[myAppDelegate hat]

覆盖集和获取

当您这样做时,@synthesize hat = _hat您实际上是在创建一个 get 和一个_hat关联了实例变量的 set。这个实例变量只能在你的gets/sets中访问,甚至在你的类中你应该使用你的sets/gets(使用self.property

您可以覆盖集合并通过@synthesize覆盖以下方法创建:

- (void) setHat:(NSString*) aHat
- (NSString *) hat
于 2012-10-22T14:33:30.107 回答
2

正如 Tiago 所说,将 @property 声明放在 .m(实现)文件的类扩展中是一种使属性私有的方法,因此只有类本身才能访问它。当在 .h(公共接口文件)中声明时,所有导入该 .h 文件的代码都可以看到它。请记住,@properties 实际上只是为了方便声明和合成访问器方法,并且与 Objective-C 中的所有方法一样,它们从来都不是真正的私有方法。您得到的最好的结果是编译器警告,如果您尝试在另一个类中使用非公共方法,则没有公共接口声明有问题的方法。

对于您问题的第二部分,这声明了一个名为 myString 的实例变量(“ivar”):

@interface MyClass : NSObject
{
    NSString *myString;
}

虽然这声明了一个名为 myString 的属性:

@property NSString *myString;

实例变量和 @property 之间的区别比仅仅说 ivar 只能由您的类的实例访问更重要。声明 ivar 会将变量添加到内存中的类结构中。相反,@properties 在类上声明/定义方法。默认情况下,这些方法设置/获取关联的且名称相似的 ivar 的值,但这不是必需的,并且具有不直接访问 ivar 的 @property 的方法是完全可以接受的并且很常见。比如说一个类,它的 firstName 和 lastName 属性由_firstNameand支持_lastNameivars 以及第三个 fullName 属性,它简单地将 firstName 和 lastName getter 方法返回的值连接在一起(和/或在其 set 方法中拆分两个部分的名称)。

于 2012-10-22T14:43:01.867 回答