更多关于财产释放

时间:2012-01-31 19:10:29

标签: objective-c ios ios5 properties

也许有人可以解释财产之间的区别:

<。>文件中的

@property(nonatomic,retain) NSString *someString;
@property(nonatomic,retain) NSString *someString2;
<。>文件中的

@synthesize someString = _someString;

@synthesize someString2;

在控制器中使用_someString和self.someString2有什么区别?  并且在dealloc中我应该如何释放这些属性的

[_someString release];

[self.someString2 release];

OR

_someString = nil;
_someString2 = nil;

5 个答案:

答案 0 :(得分:5)

synthesize someString = _someString;

这表示合成属性someString但是为了直接访问,请使用_somestring

synthesize someString2;

这表示合成属性someString2但是为了直接访问,请使用someString2

将其视为编译器为您生成iVar,但在第一种情况下,iVar称为_someString,第二种称为someString2

这是一种常见的用法(我最近转移到它),以便当您直接处理对象时(例如初始化者或dealloc,您不应该使用self)您可以立即看到当您编写_someString = @"aString";时,您没有通过应用内存管理类型的属性方法(例如保留或复制)。过去常见的是人们会直接分配值,然后想知道他们为什么不被保留。

[_someString release];
[_someString2 release];

将发布方法直接发送给对象。

self.someString = nil;
self.someString2 = nil;

通过酒店发送。在这种情况下,没有区别。如果要分配对象会有所不同:例如:

_someString = someOtherString;

是否是泄漏(除了ARC,我将在稍后介绍),因为你只是在商店中放入一个新对象而不释放当前对象。

self.someString = someOtherString;

不泄漏任何内容,因为在设置(并保留)新对象之前,合成的setter将释放当前对象。

我说我会来ARC。在这种情况下,无论如何都不能调用release,因此不会出现问题,但_someString = someOtherString不是泄漏,因为编译器将处理为您释放当前对象。

答案 1 :(得分:1)

@synthesize someString = _someString;意味着你要创建一个具有不同名称的属性,然后是与之关联的成员变量。这可以。通常他们是同一个名字。这是一个例子,但事实并非如此。因此someString将是您的属性,_someString是您的成员变量。

至于[_someString release];和[self.someString2发布];你所看到的是在类的成员变量上调用release(这是_someString)。 [self.someString2 release]在属性返回时调用release。请记住,属性可以做更多,然后只需简单地获取和设置。它们就像你可能正确的任何其他方法一样。

另外,不要做[self.someString2 release];相反,self.someString2 = nil;这将代表您发布。这样它就会把字符串弄掉。这将保护您不会访问错误的内存,因为该字符串实际上已被释放。

答案 2 :(得分:1)

后:

property(nonatomic,retain) NSString *someString;
property(nonatomic,retain) NSString *someString2;

@synthesize someString = _someString;
@synthesize someString2;

someString是由实例变量_someString支持的属性。内存保留和释放由Obj-C管理。

  • someString的作业应使用班级中的self.someString表单,并且必须在其外使用<reference>.someString。除了初始值设定项之外,永远不应该对普通_someString进行任何分配。
  • 阅读该值只能在课程中使用_someString,但self.someString也有效,并且必须在其外使用<reference>.someString
  • 发布该值必须使用类中的self.someString = nil表单,并使用<reference>.someString = nil之外的表单。

someString2类似,但它由一个自动命名的实例变量支持,该变量恰好称为someString2

答案 3 :(得分:0)

_someString = nil不会释放您的财产。

在这种情况下,_someStringself._someString指向完全相同的对象,因此您可以使用其中任何一个进行释放。

答案 4 :(得分:0)

[_someString release];

[self.someString2 release];

发布两次,这是错误的。使用

_someString = nil;
_someString2 = nil;

只是将你的ivars设置为nil,它不会释放它们,所以这又错了。

正确:要么

self.someString = nil;
self.someString2 = nil;

[_someString release];
[_someString2 release];

我建议使用第一个(点符号),因为它做的是正确的(你不知道编译器在合成你的访问器时会生成什么样的代码......)