Iphone 保留的新发现,还是我的误解?
但是代码不会泄漏任何内存。我在泄漏和主动监测工具中得到结果 开始我很惊讶 因为 有人说“@property(retain)name;”等于下面的相等方法Iphone 保留的新发现,还是我的误解?,iphone,objective-c,memory,retain,Iphone,Objective C,Memory,Retain,但是代码不会泄漏任何内存。我在泄漏和主动监测工具中得到结果 开始我很惊讶 因为 有人说“@property(retain)name;”等于下面的相等方法 @interface DataMode : NSObject { NSString * name; } @property (retain) NSString * name; - initWithName:(NSString * )name_; @end @implementation DataMode @synthesiz
@interface DataMode : NSObject {
NSString * name;
}
@property (retain) NSString * name;
- initWithName:(NSString * )name_;
@end
@implementation DataMode
@synthesize name;
- initWithName:(NSString * )name_
{
if ([super init] != nil)
{
name = name_;
return self;
}
return nil;
}
@end
- (void) pressed:(id)sender
{
NSString * str = [NSString stringWithFormat:@"zhang"];
DataMode * a = [[DataMode alloc] initWithName:str];
a.name;
a.name;
a.name;
a.name;
a.name;
NSLog(@"name count:%d",[a.name retainCount]);
[ a release];
NSLog(@"str count:%d",[str retainCount]);
}
@end
the output is
name count:7
str count:7
如果是的话。它不能解释上述输出结果
我认为方法应该如此
- getname
{
return name;
}
因此,这可以解释高数字7,并且不会泄漏任何内存
这是我的猜测。这花了我太多时间,我感到羞愧
我的理解是对的???欢迎发表您的帖子和评论。您应该键入
- getname
{
[name retain];
[name autorelease];
return name;
}
你应该打字
- getname
{
[name retain];
[name autorelease];
return name;
}
“某人”错了。发件人:
如果指定了保留
或复制
,但未指定非原子
,则在
引用计数环境,用于
对象属性使用锁并保留和自动删除返回的
价值实施将类似于以下内容:
- initWithName:(NSString * )name_
{
self = [super init];
if (self != nil)
{
name = name_;
}
return self;
}
如果指定非原子
,则对象属性的合成访问器直接返回值
“某人”错了。发件人:
如果指定了保留
或复制
,但未指定非原子
,则在
引用计数环境,用于
对象属性使用锁并保留和自动删除返回的
价值实施将类似于以下内容:
- initWithName:(NSString * )name_
{
self = [super init];
if (self != nil)
{
name = name_;
}
return self;
}
如果指定非原子
,则对象属性的合成访问器直接返回值
1) retainCount
对您没有用
2) retainCount
对您没有用
3) 是的,您的属性应该使用retain+autorelease(在一些情况下,您可以违反此规则——这里不详细介绍它们)
(请注意,这也不是线程安全的,属性也不是)
4) 您的NSString属性应该声明为copy
(而不是retain
)
5) 您的initWithName:
应该复制参数name
(假设复制了属性)
1) retainCount
对您没有用
2) retainCount
对您没有用
3) 是的,您的属性应该使用retain+autorelease(在一些情况下,您可以违反此规则——这里不详细介绍它们)
(请注意,这也不是线程安全的,属性也不是)
4) 您的NSString属性应该声明为copy
(而不是retain
)
5) 您的initWithName:
应该复制参数name
(假设复制了属性)
考虑到您对环境还不熟悉,您很可能应该使用ARC,而不必担心这类事情 重新计算是没有用的。别这么说。 重复: 重新计算是没有用的。别这么说。 这对于查找泄漏是没有用的,因为有更好、更准确和更少误导性的工具可用 您的代码有几个问题(但泄漏不是其中之一):
- NSString*属性应该是
copy
- 您不使用该属性在
中设置字符串值,因此DataMode实例不保留其字符串init
- 没有dealloc方法
stringWithFormat:
,常量字符串将变为非常量字符串。如果您使用了常量字符串或stringWithString:
,它将是abazillionsomething(unsigned-1…UINT_MAX…)
在任何情况下,您都有:
- +对于
stringWithString:
- +1用于每次调用
a.name
如果Instruments声称存在泄漏,请发布屏幕截图。鉴于您对环境还不熟悉,您最有可能使用ARC,而不必担心此类问题 重新计算是没有用的。别这么说。 重复: 重新计算是没有用的。别这么说。 这对于查找泄漏是没有用的,因为有更好、更准确和更少误导性的工具可用 您的代码有几个问题(但泄漏不是其中之一):
- NSString*属性应该是
copy
- 您不使用该属性在
中设置字符串值,因此DataMode实例不保留其字符串init
- 没有dealloc方法
stringWithFormat:
,常量字符串将变为非常量字符串。如果您使用了常量字符串或stringWithString:
,它将是abazillionsomething(unsigned-1…UINT_MAX…)
在任何情况下,您都有:
- +对于
stringWithString:
- +1用于每次调用
a.name
如果Instruments声称存在泄漏,请发布屏幕截图。错误在于您正在使用
retainCount
检查内存管理。您的代码看起来很好-您已经平衡了alloc和release。仪器告诉你没有泄漏。这就是你需要担心的。事实上,我对他的构造函数有异议——他使用“name”而不是“self.name”,我相信这实际上是将它赋给内部变量,而不是属性(因此它不会被保留)。它没有泄漏的唯一原因是他使用了stringWithFormat。我个人认为他应该在初始化器中使用name=[name\uuCopy]
,并在dealoc中释放name
。在init
函数中调用self
通常不是一个好主意。错误在于您正在使用retainCount
检查内存管理。您的代码看起来很好-您已经平衡了alloc和release。仪器告诉你没有泄漏。这就是你需要担心的。事实上,我对他的结构有异议
name = [name_ copy];