更多关于财产释放

Str*_*boy 0 properties objective-c ios ios5

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

在.h文件中

@property(nonatomic,retain) NSString *someString;
@property(nonatomic,retain) NSString *someString2;
Run Code Online (Sandbox Code Playgroud)

在.m文件中

@synthesize someString = _someString;
Run Code Online (Sandbox Code Playgroud)

要么

@synthesize someString2;
Run Code Online (Sandbox Code Playgroud)

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

[_someString release];
Run Code Online (Sandbox Code Playgroud)

[self.someString2 release];
Run Code Online (Sandbox Code Playgroud)

要么

_someString = nil;
_someString2 = nil;
Run Code Online (Sandbox Code Playgroud)

Abi*_*ern 5

synthesize someString = _someString;
Run Code Online (Sandbox Code Playgroud)

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

synthesize someString2;
Run Code Online (Sandbox Code Playgroud)

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

可以把它想象成编译器为你生成iVar,但在第一种情况下调用iVar _someString而第二种调用someString2

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

[_someString release];
[_someString2 release];
Run Code Online (Sandbox Code Playgroud)

将release方法直接发送给对象.

self.someString = nil;
self.someString2 = nil;
Run Code Online (Sandbox Code Playgroud)

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

_someString = someOtherString;
Run Code Online (Sandbox Code Playgroud)

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

self.someString = someOtherString;
Run Code Online (Sandbox Code Playgroud)

不泄漏任何东西,因为在设置(和保留)新对象之前,合成的setter将释放当前对象.

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