目标C:我应该分配变量AND创建一个属性还是只是其中之一?

h0u*_*sni 1 variables properties objective-c header-files

我有一个头文件(.h),我想申报,name但所有这些方法都是一样的,我认为因为我没有看到任何功能上的差异.你能告诉我两者之间的区别是什么:

这两个声明:

@interface someClass : UIViewController
{
    NSString *name;
}

@property (nonatomic, copy) NSString *name;

@end
Run Code Online (Sandbox Code Playgroud)

没有变量:

@interface someClass : UIViewController
{

}

@property (nonatomic, copy) NSString *name;

@end
Run Code Online (Sandbox Code Playgroud)

或没有财产:

@interface someClass : UIViewController
{
    NSString *name;
}

@end
Run Code Online (Sandbox Code Playgroud)

ser*_*gio 5

   @interface someClass : UIViewController
   {
     NSString *name;
   }

   @property (nonatomic, copy) NSString *name;

   @end
Run Code Online (Sandbox Code Playgroud)

这样做,您将明确声明属性和ivar.

属性只是一组方法:

 - (void)setName:(NSString*)name;
 - (NSString*)name;
Run Code Online (Sandbox Code Playgroud)

ivar是保存属性方法管理的值的内存存储.这允许你这样做:

self.name = ... // access through setter method
name = ... // direct access
Run Code Online (Sandbox Code Playgroud)

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

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

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

使用直接访问,您可以自行管理内存(如果您不使用ARC).如果您使用ARC但未定义属性,则无法通过指定所有权来控制内存的管理方式:strong,weak,retain).

 @interface someClass : UIViewController
 {

 }

 @property (nonatomic, copy) NSString *name;

 @end
Run Code Online (Sandbox Code Playgroud)

在这里你只声明属性; ivar是由@synthesize您的实现文件中的指令"推断"的.这只能在Objective C 2.0及更高版本中实现(之前,上述ivar声明是强制性的).

与上述相同的考虑适用,具有细微差别:对于较旧版本的LLVM(ObjC编译器),您将无法直接引用自动合成的ivar; 对于当前版本的LLVM,如果省略该@synthesize指令,那么也会声明以您的属性命名的自动ivar(在您的情况下它将是_name).

最后一段可能看起来有点"先进",或者做作,但你可以放心地忽略它.

 @interface someClass : UIViewController
 {
    NSString *name;
 }

 @end
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您只是声明了ivar.没有访问方法.您需要自己处理内存管理(如果不使用ARC),此外您将无法从课外访问变量.为此你需要访问者.

希望这可以帮助.