我对如何在目标C中声明变量感到困惑。
1:我看到@property
和@synthesize
语句被使用。我的问题是,这两个声明是什么?为什么他们总是一起使用?我想@synthesize
是创建getter和setter的快捷方式吗?
2:说,我想声明一个只能在声明的类中访问的NSMutableArray。我必须在使用myArray = [[NSMutableArray alloc] init]
方法写入内容之前执行addObject
。我什么时候发布阵列呢?
3:是否有一种不同的方式来声明一个只能在声明可以在所有类访问的类中访问的变量?
4:与问题2类似,但现在变量是NSString。为什么我不必分配& init它在自己的类中共享相同的变量?在self.myString = @"";
到myString = @"";
非常感谢。
答案 0 :(得分:5)
关于你的第一个问题:
@property (nonatomic, retain) NSString * someProperty;
这声明了该类的属性。它成为班级公共合同的一部分,但仍然缺乏重要的东西 - 实际实施
@synthesize someProperty;
这是编译器糖,它为您的属性创建一个getter和setter方法。也就是说,这是为了在您的类和其他类中实际使用您的属性所需的实现。
在几乎所有情况下,您声明的每个@synthesize
始终都有@property
。
关于你的第二个问题:
您对如何初始化数组属性是正确的。要释放它,您将在类dealloc方法中执行以下操作:
- (void) dealloc {
self.myarray = nil;
[super dealloc];
}
这有效地释放了数组(假设您使用关键字 retain 声明了您的属性)。
关于你的上一个问题:
类的属性始终可从其他类获得。要创建全局可访问的变量,您可以将其声明为static
。
答案 1 :(得分:2)
广告1:属性是用于控制getter和setter访问ivar(通常是私有)的构造。实际上,财产甚至不需要支持ivar。是的,@synthesize生成getter和setter(和ivar)。
广告2:当您不再需要它时,您会将其释放。当这取决于你的代码的逻辑。
广告3:如果我理解正确,你需要@private ivars。通常,ivars受到保护,即只能在类或派生类中访问。私人ivars只能在课程内部访问。属性可公开访问。
Ad 4:myString = @“”直接写入ivar,而self.myString = @“”使用属性设置器。
答案 2 :(得分:1)
1)@property
声明一个可公开访问的变量以及相关的getter和setter。 @synthesize
使编译器自动生成getter和setter的定义(代码)。
2)您将在头文件中的类声明中声明NSMutableArray。您可以在init
方法中初始化变量,然后在dealloc
方法中释放变量。
3)使用@property
创建的变量是公共的。您的类声明中定义的变量(在头文件中使用@interface
)可以使用@private
关键字声明为该类的私有。
答案 3 :(得分:0)
你需要在Objective-C上找到一个文本或者找一个在线教程 - 这是一种足够神秘的语言,你不能指望用它来点滴。“
有变量和属性 - 两个不同的东西有些交叉。
您可以使用与C / C ++相同的方式声明普通旧实例变量,或多或少:
NSArray* myArray;
例如,放在@interface的{}
封闭部分。
但是您也可以拥有一个属性,您可以在@property
声明中(在结束@interface
之后)说}
来声明。属性有一个getter方法 - 默认名为myProperty
- 和一个putter方法 - 默认名为setMyProperty
。如果myProperty
与您的某个实例变量的名称相同,那么您可以使用@synthesize
自动创建这些方法。
请注意,使用默认的setter方法时,属性可能会自动retain
。这在管理存储方面相当方便。
但是管理存储是一个很大的主题,你必须阅读一些很好的教程 - 我们无法在几个段落中解释它。