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编程语言
内存管理编程指南
归档时间: |
|
查看次数: |
609 次 |
最近记录: |