在 Objective-C++ 类中创建对象时,我发现行为有所不同。
如果我使用 dictionaryWith 和 numberWith 创建一个NSDictionary
包含NSNumber
对象,那么这些对象永远不会被释放。如果我使用alloc
and创建它们initWith
,那么它们就会被清理得很好。
我没有在同一个项目的 Objective-C 类中看到这一点。该项目已启用 ARC。我正在使用 Xcode 4.5.2 中的分配分析工具,查看CFNumber
和 __的“# Living”值NSDictionaryl
。
// These objects will NOT be released.
NSDictionary* dict1 = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithUnsignedInt:val1], @"val1",
[NSNumber numberWithUnsignedInt:val2], @"val2",
[NSNumber numberWithUnsignedInt:val3], @"val3",
nil];
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter]
postNotificationName:KEY_NET_STATS_VIEW_UDATE object:nil userInfo:dict1];
});
// These objects *will* be released.
NSDictionary* dict2 = [[NSDictionary alloc] initWithObjectsAndKeys:
[[NSNumber alloc] initWithUnsignedInt:val1], @"val1",
[[NSNumber alloc] initWithUnsignedInt:val2], @"val2",
[[NSNumber alloc] initWithUnsignedInt:val3], @"val3",
nil];
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter]
postNotificationName:KEY_NET_STATS_VIEW_UDATE object:nil userInfo:dict2];
});
使用 alloc/initWith 编写代码对我来说没有问题,但我想了解为什么会有差异。我读过的所有内容都表明它们在 ARC 下应该是等效的。
调用此代码时的堆栈跟踪。以下所有内容都是C ++,顺便说一句。
#0 0x001fbbe4 in ItRtpSessionManageriOS::OnItRtpOutgoingStatsUpdate(ItRtpSession&, ItRtpSessionManager::ItRtpStats const&)
#1 0x0007018a in CSceApp::OnItRtpOutgoingStatsUpdate(ItRtpSession&, ItRtpSessionManager::ItRtpStats const&)
#2 0x0006b808 in ItRtpSession::CallStatsUpdateCallback(ItRtpSessionManager::ItRtpStats const&)
#3 0x0006ab1e in ItRtpSessionSharedCommXYZ::UpdateOutgoingStats(unsigned long, unsigned long)
#4 0x0006a958 in ItRtpSessionSharedCommXYZ::Update(unsigned int, unsigned int)
#5 0x000764ca in CSceApp::EvTimerServiceMgrAwaken(bool, unsigned int, void*)
#6 0x00076908 in non-virtual thunk to CSceApp::EvTimerServiceMgrAwaken(bool, unsigned int, void*)
#7 0x002a0134 in xyz::CServicingThread::Activate(unsigned long long, bool*)
#8 0x0029fb98 in xyz::CServicingThread::Behavior()
#9 0x0029fc34 in non-virtual thunk to xyz::CServicingThread::Behavior()
#10 0x002578de in xyz::CAliveObj::StartMechanism(void*)
#11 0x00259f9e in xyz::CThread::ThreadEntry(void*)
#12 0x348b5310 in _pthread_start ()
#13 0x348b51d8 in thread_start ()