C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Objective-C自动释放池不释放对象大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我是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,@R_197_3377@ * 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)上调用一个方法,这恰好@L_675_16@纯粹运气. (特别是,(自动)释放不会自动将引用设置为nil).

大佬总结

以上是大佬教程为你收集整理的Objective-C自动释放池不释放对象全部内容,希望文章能够帮你解决Objective-C自动释放池不释放对象所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。