我有一个视图控制器。视图控制器有一个名为streamController的保留对象,它是一个NSObject子类,用于处理我服务器的所有数据I / O.一切都很好,除了我想弄清楚为什么有些东西在所说的streamController上泄漏了。我在那里放了一个NSLog,我从来没有看到它被解雇。我完全不知道为什么,因为我在我的视图控制器的dealloc方法中释放了控制器。
来自视图控制器界面...
StreamController *streamController;
@property (nonatomic, retain) StreamController *streamController;
来自视图控制器实现的......
@synthesize streamController;
- (id)init {
[super init];
self.streamController = [[StreamController alloc] init];
}
- (void)dealloc {
NSLog(@"dealloc view controller");
[streamController release];
[super dealloc];
}
来自StreamController实现的......
- (void)dealloc {
NSLog(@"dealloc stream controller");
[super dealloc];
}
这个最后的dealloc永远不会被调用。为什么呢?
答案 0 :(得分:3)
我相信你只是在泄漏记忆, 如果您的属性具有retain属性,那么您应该看一下以下示例:
//A
self.streamController = [[StreamController alloc] init];
//B
StreamController * st = [[StreamController alloc] init];
self.streamController = st;
[st release];
//C
streamController = [[StreamController alloc] init];
如果您检查保留计数,您会看到在A方法中,streamController
对象的retainCount
为{2},而在B中则只有1。
原因:
在执行[[StreamController alloc] init];
时,您的对象在传递给您的财产之前已经有retainCount
1。然后,由于您将其声明为保留,它将被保留,因此retainCount
变为2。
在B中基本相同,但是在将对象传递给属性之后才释放它。因此,它以1的retainCount结束。(这就是我们想要的)
在C中,您没有使用该属性,而是直接设置该值。因此它只会被保留一次。在这种情况下这很好,因为是初始化。
如果您确定streamController是nil(比如对象的初始化),我建议使用B或C语言。
希望这有帮助