1

我有一个头文件(.h),我想声明name,但我认为所有这些方式都一样,因为我没有看到功能上有任何区别。你能告诉我有什么区别:

这两个声明:

@interface someClass : UIViewController
{
    NSString *name;
}

@property (nonatomic, copy) NSString *name;

@end

无变量:

@interface someClass : UIViewController
{

}

@property (nonatomic, copy) NSString *name;

@end

或没有财产:

@interface someClass : UIViewController
{
    NSString *name;
}

@end
4

2 回答 2

4
   @interface someClass : UIViewController
   {
     NSString *name;
   }

   @property (nonatomic, copy) NSString *name;

   @end

这样做您将显式声明一个属性和一个 ivar。

属性只是一组方法:

 - (void)setName:(NSString*)name;
 - (NSString*)name;

ivar 是保存属性方法管理的值的内存存储。这允许您执行以下操作:

self.name = ... // access through setter method
name = ... // direct access

使用属性的优点是它们为您处理内存管理。例如,在您的情况下,属性是 type copy:这意味着使用第一个语法 ( self.name = ...) 将完成对象的副本。如果不使用属性,您将明确需要做:name = [originalString copy];以获得相同的效果。

您可以为属性(但不是 ivars)指定的其他选项是:strongweak所有权。

此外,属性还表示从类外部访问变量的公共接口。

使用直接访问您可以自行管理内存(如果您不使用 ARC)。如果您使用 ARC 并且不定义属性,您将无法通过指定所有权来控制内存的管理方式:强、弱、保留)。

 @interface someClass : UIViewController
 {

 }

 @property (nonatomic, copy) NSString *name;

 @end

这里你只声明属性;ivar 由@synthesize您的实现文件中的指令“推断”。这仅在 Objective C 2.0 及更高版本中是可能的(以前,上面的 ivar 声明是强制性的)。

与上述相同的注意事项适用,但有细微差别:使用旧版本的 LLVM(ObjC 编译器)您将无法直接引用自动合成的 ivar;对于当前版本的 LLVM,如果您省略该@synthesize指令,那么还将声明一个以您的属性命名的自动 ivar(在您的情况下为_name)。

最后一段可能看起来有点“高级”或做作,但您可以放心地忽略它。

 @interface someClass : UIViewController
 {
    NSString *name;
 }

 @end

在这种情况下,您只是在声明 ivar。没有访问器方法。您将需要自己处理内存管理(如果不使用 ARC),而且您将无法从类外部访问该变量。为此,您需要访问器。

希望这可以帮助。

于 2013-01-22T09:56:54.257 回答
0

情况1:

是旧方法,这里的@property和变量在你之前是不相关的@synthesize name = name

访问方法:变量:name = @"hello"; //direct access to viariable

设置器/获取器:self.name = @"hello" // set value to name using setName: selector

使用最新的 xcode,仅此属性就足够了。

案例 2:新的 xcode 样式。这里的合成和变量创建由编译器负责。(所以更少的 2 行代码,这也有助于内存管理)

访问方法:变量:_name = @"hello"; //direct access to viariable

设置器/获取器:self.name = @"hello" // set value to name using setName: selector

案例 3:这里的名称只是一个变量,它没有 setter 或 getter。如果没有属性(或)setter & getter,这与局部变量一样好,并且不能从其他对象访问。

于 2013-01-22T09:59:25.673 回答