@ property/@合成问题

Buy*_*ian 10 iphone memory-management synthesizer properties objective-c

我正在阅读有关内存管理的所有文档,我对某些事情感到有些困惑.

使用@property时,它会为对象创建getter/setter:

.h:@property(retain,nonatomic)NSString*myString

.m:@synthesize myString

我理解这一点,但我感到困惑的是使用自我.我在不同的博客和书籍中看到了不同的语法.我见过:

myString = [NSString alloc] initWithString:@"Hi there"];
Run Code Online (Sandbox Code Playgroud)

要么

self.myString = [NSString alloc] initWithString:@"Hi there"];
Run Code Online (Sandbox Code Playgroud)

然后在dealloc我看到:

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

要么

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

要么

self.myString = nil;
[myString release];
Run Code Online (Sandbox Code Playgroud)

在这个网站上,有人说使用self会为保留计数增加另一个增量?是真的,我没有在任何地方见过.

提供自动释放的自动吸气剂/定型器吗?

这是完成所有这些的正确方法吗?

谢谢!

Nic*_*ver 18

如果您没有使用点语法,则不使用任何setter或getter.

接下来是,它取决于财产的声明方式.

我们假设这样的事情:

@property (nonatomic, retain) Article *article;
...
@synthesize article;
Run Code Online (Sandbox Code Playgroud)

用文章分配文章

self.article = [[Article alloc] init];
Run Code Online (Sandbox Code Playgroud)

将覆盖alloc/init返回的实例并导致泄漏.这是因为文章的设置者将保留它并将为您释放任何先前的实例.

所以你可以把它重写为:

self.article = [[[Article alloc] init] autorelease];
Run Code Online (Sandbox Code Playgroud)

这样做

article = [[Article alloc] init]; 
Run Code Online (Sandbox Code Playgroud)

也可以,但可能涉及泄漏,因为文章可能已经拥有对实例的引用.因此,需要事先释放价值:

[article release];
article = [[Article alloc] init]; 
Run Code Online (Sandbox Code Playgroud)

释放内存可以完成

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

或者

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

第一个直接访问该字段,不涉及setter/getters.第二个使用setter将nil设置为字段.哪个将释放当前实例,如果有一个实例之前将其设置为nil.

这个结构

self.myString = nil; 
[myString release];
Run Code Online (Sandbox Code Playgroud)

太多了,它实际上发送到零,这是无害的,但也是不必要的.

你只需要使用点语法精神映射帽子是使用访问器方法:

self.article = newArticle
// is
[self setArticle:newArticle];
Run Code Online (Sandbox Code Playgroud)

myArticle = self.article;
// is
myArticle = [self article];
Run Code Online (Sandbox Code Playgroud)

关于阅读的一些建议,Apple的所有官方文件:

Objective-C编程语言

内存管理编程指南