Iphone 保留的新发现,还是我的误解?

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

但是代码不会泄漏任何内存。我在泄漏和主动监测工具中得到结果

开始我很惊讶

因为

有人说“@property(retain)name;”等于下面的相等方法

@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

  • 您不使用该属性在
    init
    中设置字符串值,因此DataMode实例不保留其字符串

  • 没有dealloc方法

由于使用了
stringWithFormat:
,常量字符串将变为非常量字符串。如果您使用了常量字符串或
stringWithString:
,它将是abazillionsomething(unsigned-1…UINT_MAX…)

在任何情况下,您都有:

  • +对于
    stringWithString:
  • +1用于每次调用
    a.name

如果Instruments声称存在泄漏,请发布屏幕截图。

鉴于您对环境还不熟悉,您最有可能使用ARC,而不必担心此类问题

重新计算是没有用的。别这么说。 重复:

重新计算是没有用的。别这么说。 这对于查找泄漏是没有用的,因为有更好、更准确和更少误导性的工具可用

您的代码有几个问题(但泄漏不是其中之一):

  • NSString*属性应该是
    copy

  • 您不使用该属性在
    init
    中设置字符串值,因此DataMode实例不保留其字符串

  • 没有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];