【发布时间】:2011-06-23 05:39:26
【问题描述】:
关于如何在 Objective-C 2.0+ 中创建正确的只读属性,我有 2 个问题。
这是我原来的方法,我们称之为solution 1:
@interface ClassA{
@private
NSMutableArray *a_;
}
// NOTE: no retain
@property (nonatomic, readonly) NSMutableArray *a;
@end
///////////////////////////////////////
@implementation ClassA
@synthesize a = a_;
- (NSMutableArray *)a{
if(nil == a_){
a_ = [[NSMutableArray alloc] array];
}
// Potential leak warning on the following line.
return a_;
}
- (void)dealloc{
// I released the object here, I think this should be safe.
[a_ release];
[super dealloc];
@end
当我编译和分析它时,系统会报告如下警告:“'return a_' 处可能存在泄漏”。
然后我再次阅读了Objective-C的文档,并找到了另一种方法,如下所示。我们称之为解决方案 2。
@interface ClassB{
@private
NSMutableArray *a_;
}
// NOTE: make it retain+readonly
@property (nonatomic, readonly, retain) NSMutableArray *a;
@end
///////////////////////////////////////
// Add a private category
@interface ClassB ()
// reset the property to readwrite
@property (nonatomic, readwrite, retain) NSMutableArray *a;
@end
//////
@implementation ClassB
@synthesize a = a_;
- (id)init{
if(self = [super init]){
// NOTE: set the value as we use property normally.
self.a = [NSMutableArray array];
}
return self;
}
- (void)dealloc{
self.a = nil;
[super dealloc];
@end
现在,这是我的问题:
- 是否可以使用解决方案 1 并消除“潜在泄漏”?
- 解决方案 2 是常用解决方案吗?
谢谢你们!
-- 托尼
【问题讨论】:
-
[[NSMutableArray alloc] array]应该给你一个编译器警告,它肯定会崩溃。你想要[[NSMutableArray alloc] init]。 -
你错过了
*NSMutableArray a_; -
@Simon,谢谢,我是手动输入的,没有用编译器编译。我已经修好了。
-
@Kevin Ballard,你是对的。这是我的愚蠢错误。将
[[NSMutableArray alloc] array]更改为[[NSMutableArray alloc] init]后。一切顺利。 能否请您将其回复为答案,以便我将您的回复标记为正确答案并关闭此问题。 -
我知道这是一篇旧帖子,但我只是注意到一个小错误(我最近才学到的东西)。在您的代码中,您有注释
// Add a private category,而后面的内容实际上是类扩展,而不是类别。非常相似的符号,但有区别。使用类别您只能添加新方法,使用扩展您可以添加方法和属性。
标签: iphone objective-c properties