加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Objective-C自动释放池不释放对象

发布时间:2020-12-16 09:27:36 所属栏目:百科 来源:网络整理
导读:我是Objective-C的新手,正在阅读内存管理.我试图用NSAutoreleasePool玩一下但不知何故它不会释放我的对象. 我有一个带有setter和getter的类,它基本上设置了一个NSString *名称.释放池后,我尝试NSLog对象,它仍然有效,但我想它不应该? @interface TestClass :
我是Objective-C的新手,正在阅读内存管理.我试图用NSAutoreleasePool玩一下但不知何故它不会释放我的对象.

我有一个带有setter和getter的类,它基本上设置了一个NSString *名称.释放池后,我尝试NSLog对象,它仍然有效,但我想它不应该?

@interface TestClass : NSObject
{
    NSString *name;
}

- (void) setName: (NSString *) string;
- (NSString *) name;


@end

@implementation TestClass   

- (void) setName: (NSString *) string
{
        name = string;
}  

- (NSString *) name
{
    return name;
}

@end

int main (int argc,const char * argv[]) {

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

TestClass *var = [[TestClass alloc] init];

[var setName:@"Chris"];
[var autorelease];
[pool release];

// This should not be possible?
NSLog(@"%@",[var name]);


return 0;
}

解决方法

您的代码有几个问题.首先,既不复制也不保留存储在名称实例变量中的字符串.因此,如果字符串由将其存储到属性中的任何人释放,则会留下悬空引用.你应该做

- (void) setName: (NSString*) aName {
    if( name != aName ) {
        if( name ) [name release];
        name = [aName retain];    // or copy
    }
}

或者从一开始就使用属性.

此外,如果在实例变量中保留对象引用,则应提供dealloc方法的正确定义:

- (void) dealloc {
    self.name = nil;
    [super dealloc];
}

最后,仅仅因为一个对象已被解除分配,并不意味着前一个实例的内存无效.你的原始程序最有可能在一个悬空参考(var)上调用一个方法,这恰好在这里纯粹运气. (特别是,(自动)释放不会自动将引用设置为nil).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读