也许有人可以解释财产之间的区别:
<。>文件中的
@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;
答案 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
不会释放您的财产。
在这种情况下,_someString
和self._someString
指向完全相同的对象,因此您可以使用其中任何一个进行释放。
答案 4 :(得分:0)
[_someString release];
和
[self.someString2 release];
发布两次,这是错误的。使用
_someString = nil;
_someString2 = nil;
只是将你的ivars设置为nil,它不会释放它们,所以这又错了。
正确:要么
self.someString = nil;
self.someString2 = nil;
或
[_someString release];
[_someString2 release];
我建议使用第一个(点符号),因为它做的是正确的(你不知道编译器在合成你的访问器时会生成什么样的代码......)