2011-08-31 73 views
5

我在客观C.基本目标C变量声明

如何变量声明

1困惑:我看到使用@property@synthesize声明。我的问题是,这两个声明有什么关系?为什么他们总是一起使用?我猜@synthesize是创建getter和setter的捷径吗?

2:说,我想声明一个NSMutableArray,只能在声明的类内部访问。在使用addObject方法向它写入内容之前,必须执行myArray = [[NSMutableArray alloc] init]。那么我什么时候释放数组?

3:是否有不同的方式来声明一个变量,只有在它被宣布在所有类是可访问的类时,才可访问?

4:与问题2类似,但现在变量是NSString。为什么我不需要分配& init来在它自己的类中共享相同的变量?请告诉我感谢不同myString = @"";

之间 self.myString = @"";

很多。

+0

当你进入objective-c时,你可能想看看斯坦福大学的课程(iTunes)。它帮助我学习了曲线。 – nykash

+0

这是一个非常广泛的问题,涵盖在SO上很好的地面。请看看周围。这里有四个以前的帖子解决你的问题。 1:[@property和@synthesize是什么区别?](http:// stackoverflow。2)[何时发布实例变量](http://stackoverflow.com/questions/4063905/)3:[如何声明实例变量在实例外不可见?](http:/ /问题/ 806379 /) /stackoverflow.com/questions/5826345/)4:[self.var与var之间的区别](http://stackoverflow.com/questions/4627646/)每个主题都有其他人。 –

回答

1

1)@property声明一个公众可访问的变量和相关联的获取和设置。 @synthesize会导致编译器自动生成getter和setter的定义(代码)。

2)你会在你的类声明中的头文件中声明NSMutableArray。您将在您的init方法中初始化该变量,然后您将在dealloc方法中释放该变量。

3)使用@property创建的变量是公开的。可以使用@private关键字将类声明中定义的变量(在头文件中使用@interface)声明为该类的私有变量。

约翰,这些问题都很基础。您可能会从这里的Objective-C编程介绍中获得很多(http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html#//apple_ref/doc/uid/TP30001163)。

+0

'@ property'不声明可公开访问的_variable_。 ivar本身(如果合成)是'@ protected'。它声明的是该类某些方面的接入点。实际上甚至不需要支持它的变量,只要你履行了getter和setter方法的合约(或只是getter,在'readonly'的情况下)。 –

+0

谢谢澄清Josh。 –

+1

FWIW,如果你写自己的getter和/或setter,一个属性甚至不必有一个ivar。它也可以计算一些东西,或者从一个项目转换到另一个项目。例如。一个Angle类也可以拥有属性弧度的属性度数。只有属性弧度有后盾,但属性度数(通过setter和getter,分别为'degrees'和'setDegrees:')根据方向转换为弧度和弧度。 File类可以具有fullName属性,该属性使用服务器,目录和文件名来生成或解析完全限定的名称。 –

5

关于第一个问题:

@property (nonatomic, retain) NSString * someProperty; 

此声明类的属性。它成为类的公共合同的一部分,但仍然缺乏一些重要的东西 - 实际执行

@synthesize someProperty; 

这是编译器的糖,其创建自己财产的getter和setter方法。换句话说,这是为了在您的课堂和其他课程中实际使用您的财产而需要的实施。

您几乎在所有情况下都会为您申报的每个@property设置一个@synthesize


关于第二个问题:

您是如何初始化数组属性正确。为了释放它,你会做你的类dealloc方法如下:

- (void) dealloc { 
    self.myarray = nil; 

    [super dealloc]; 
} 

这有效地释放了阵列(假设你用关键字宣布你的财产保留)。


并为你的最后一个问题:一类

属性始终可以从其他类。为了创建一个全球可访问的变量变量你会声明它为static

+0

您可能没有针对每个属性的“@综合”。它也可以是'@ dynamic',或者你可以简单地声明一个ivar并实现正确命名的方法。 –

+0

我同意你的第一点,但你的第二点与@property无关,并且与KVC更相关。编辑我的回答来反思。 – Perception

+1

@Josh:的确如此。在其他评论之一中,我举了几个例子,你写了我们自己的访问器,甚至没有ivar,因为访问者可以依赖其他方式(直接文件访问,端口,数据库,算法等) )比直接获得或设置伊娃。在这种情况下,你不合成。 –

2

广告1:一个属性是一个构造来控制获取者和设置者访问ivar(通常是私有的)。事实上,一个财产甚至不需要支持伊娃。是的,@synthesize会产生getter和setter(和ivar)。

广告2:当你不再需要它时,你可以释放它。当这取决于你的代码的逻辑。

广告3:如果我理解正确,则需要@私人ivars。通常情况下,ivars是受保护的,即只能在类或派生类中访问。私人ivars只能在课堂内部进行访问。属性可公开访问。

广告4:myString = @“”直接写入伊娃,而self.myString = @“”使用属性设置器。

+0

我偶然发现一个场合,我无法在课堂上读回伊娃。然后,我正在使用'ivar = something'。把它改成'self.ivar = something'解决了这个问题。你能分享一些见解吗?我猜这个伊娃在我读回NULL时得到了自动发布。如果有帮助,伊娃是CLLocation。我不需要为'NSString' ivars执行'self'。 – John

+0

属性,如果声明为(复制)或(保留),将保留该项目(并释放前一项),而直接访问伊娃则不会这样做。属性可帮助您执行内存管理,因为编译器将生成正确保留和释放项目的代码。当然,它们仍然必须在dealloc中释放。所以尽量在任何地方使用属性,除了在init和dealloc中。 –

0

你需要在Objective-C上找到一个文本或者找到一个在线教程 - 这是一种足够神秘的语言,你不能希望用点滴和单调来拾取它。

有变量,有属性 - 两个不同的东西相交。

可以声明普通老式实例变量如C/C++相同的方式,更多或更少:

NSArray* myArray; 

例如,放置在@interface的{}密闭部分。

但是,您也可以拥有一个物业,您通过在@interface声明(在关闭}之后)说@property声明。属性具有getter方法 - 默认情况下称为myProperty - 和推杆方法 - 默认情况下称为setMyProperty。如果myProperty与其中一个实例变量名称相同,则可以使用@synthesize自动创建这些方法。

请注意,属性可能自动retain当使用默认设置方法。这在管理存储方面相当方便。

但是管理存储是一个很大的话题,你必须阅读一些很好的教程 - 我们无法用几段来解释它。