这三种声明变量的方法有什么区别?

时间:2012-12-13 02:03:05

标签: objective-c memory-management properties

我正在学习Objective-C并且很好奇。我可以在这些地方创建一个NSString的对象,请提供其他任何对象。对我来说,他们都做同样的事情。我不知道它们之间有什么区别。它存放在哪里?我从哪里可以访问它?有什么好处?

1)

// .h
@interface ...
@property (strong,nonatomic) NSString *text;
@end

2)

// .h
@interface ... { 
NSString *text
}
@end

3)

// .m
@interface ... ()
@property (strong,nonatomic) NSString *text;
@end

1 个答案:

答案 0 :(得分:1)

首先,我的答案是基于最新的Clang编译器,旧版本的工作略有不同。

所以,你不是创建对象。你甚至没有声明其中两个对象。

在第一种情况下,您实际上是告诉编译器您需要公开类型为text的名为NSString的属性。编译器的作用是为您_text声明一个实例变量(顺便说一下,你可以顺利访问它)以及获取和设置该实例变量所需的方法。正如您所看到的,存储仍然是内置的,您只需为您设置getter和setter。

在第二种情况下,您实际上是在自己声明一个实例变量(ivar),就像编译器使用_text一样。它习惯用_作为前缀。存储仍然是内部的。最重要的是,您无法从外部访问您的ivar,因为它没有getter或setter,隐式声明为@private

在第三种情况下,您创建一个匿名类别(因此为空括号),它会向您的类添加属性。存储的时间有点难/更难以解释,如果您对此感到好奇,可以搜索Apple文档,查看类别是什么等等。在这种情况下,你只能从你的班级中访问你的财产,这使得它在某种程度上是多余的(吸气剂和制定者),你可以将它宣布为ivar。

你也可以像这样声明你的ivars:

@interface GenericViewController : UIViewController{
    NSString * text;
}

@end



@implementation GenericViewController{
    NSString * text;
}

@end

以上两者都具有本地存储和私有可见性(无法从外部访问)。两者之间的区别在于隐式隐藏了实现中声明的实例变量,并且无法使用@ public,@ protected和@private更改可见性。如果使用这些指令,则不会出现编译器错误,但会被忽略。