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

标签 objective-c autorelease nsautoreleasepool

我是 Objective-C 的新手,正在阅读内存管理。我试图尝试使用 NSAutoreleasePool,但不知何故它不会释放我的对象。

我有一个带有 setter 和 getter 的类,它基本上设置了一个 NSString *name。释放池后,我尝试 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;
}

最佳答案

当您释放指针 var 时,您是在告诉操作系统它指向的内存可以重新分配。该指针仍然指向该内存,并且在它被重新分配之前它仍然包含您的对象的剩余部分。一旦它被重新分配,尝试调用 name 方法将不再有效。

关于Objective-C 自动释放池不释放对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2788510/

相关文章:

c++ - 将 Objective C "code blocks"转换为 C++ 中的等价物

objective-c - NSView 的角是透明的,但不应该是

objective-c - 您如何看待 Objective-C 中每次迭代保留计数并调用释放的这段代码?

ios - 以下 iOS 代码安全吗? (__autoreleasing 语义)

objective-c - performSelector In Background 在关闭 View 时导致随机崩溃

objective-c - 无法调用从 Obj-C 抛出并返回非 void 的 Swift 类中的方法

objective-c - UIButton 上的两行文本各有不同的字体

ios - 释放iOS中所有自动发布的对象

ios - 现代 iOS 8 NSOperation 使用仍然需要@autoreleasepool 吗?