调用这行代码时我得到了错误的访问权限 (objc_msgsend):
self.currentGameTeam = nil;
其中“currentGameTeam”在名为“MCState”的类的接口(interface)中定义为:
MNAvailableTeamContext *currentGameTeam;
然后我为它综合了一个属性:
@property (retain) MNAvailableTeamContext *currentGameTeam;
设置 NSZombieEnabled 后控制台显示:
*** -[MNAvailableTeamContext release]: message sent to deallocated instance 0x5b3eba0
并且调试器跟踪显示它来自合成的 setter 代码:
#3 0x0001fa96 in -[MCState setCurrentGameTeam:] at MCState.m:44
我查看了其他几个问题和线程,但找不到适用于我的案例的答案。我不明白为什么如果我合成了该属性并将其设置为零,为什么会出现错误访问。特别奇怪的是,MCState 中至少还有 3 个其他属性,它们的定义和使用方式与 currentGameTeam 完全相同,唯一的区别是它们的类型不同:
MNUserContext *storedUser;
MNActiveGameContext *storedGame;
MNAvailableUserContext *storedGameUser;
MNAvailableTeamContext *storedGameTeam;
和
@property (retain) MNUserContext *currentUser;
@property (retain) MNActiveGameContext *currentGame;
@property (retain) MNAvailableUserContext *currentGameUser;
@property (retain) MNAvailableTeamContext *currentGameTeam;
和
@synthesize currentUser;
@synthesize currentGame;
@synthesize currentGameUser;
@synthesize currentGameTeam;
最后
self.currentUser = userContext;
self.currentGame = nil;
self.currentGameUser = nil;
self.currentGameTeam = nil; // Error occurs here
其余的都正常运行 - 只有 currentGameTeam 给我带来了麻烦。有什么想法吗?
最佳答案
某处,currentGameTeam
在您尝试将其设置为 nil 之前被释放。将保留属性设置为 nil 意味着要调用释放。对已释放的对象调用释放将导致 EXC_BAD_ACCESS
。您在启用 NSZombies 的情况下运行可以确认这一点。
您可以使用带有 Zombies 工具的 Instruments 运行 - 它会为您提供有关导致僵尸调用的所有保留、释放和自动释放的更多详细信息。
关于iphone - 将合成(保留)属性设置为 nil 时的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4882293/