0

我正在学习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
4

1 回答 1

1

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

因此,您也没有在其中创建对象。你甚至没有在其中两个中声明一个对象。

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

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

在第三种情况下,您创建一个匿名类别(因此是空括号),它将属性添加到您的类。对此的存储有点难以解释/更长,如果您对此感到好奇,可以搜索 Apple 文档,查看类别是什么等等。在这种情况下,您只能从您的类中访问您的属性,这使得它在某种程度上是多余的(getter 和 setter),您可以将其声明为 ivar。

您还可以像这样声明您的 ivars:

@interface GenericViewController : UIViewController{
    NSString * text;
}

@end



@implementation GenericViewController{
    NSString * text;
}

@end

以上两者都有本地存储和私有可见性(不能从外部访问)。两者的区别在于实现中声明的实例变量是隐式隐藏的,不能用@public、@protected 和@private 改变可见性。如果您使用这些指令,您将不会收到编译器错误,但会被忽略。

于 2012-12-13T02:57:57.907 回答