iphone - 将合成(保留)属性设置为 nil 时的 EXC_BAD_ACCESS

标签 iphone objective-c properties exc-bad-access null

调用这行代码时我得到了错误的访问权限 (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/

相关文章:

python - 写一个设置方法

iPhone:可用磁盘空间

ios - 在标签栏 Controller 中的推送 View Controller 中显示工具栏

c# - 属性初始化和 'this'

objective-c - 在 NSArray 中寻找相似的字符串

objective-c - 运行 ffmpeg 终端命令后 OSX/Cocoa 应用程序崩溃

iphone - 何时在 Objective-C 中使用属性?

ios - 如何限制 iOS 8 中 View Controller 的旋转?

iphone - 递增 `static int` 会导致 SIGSEGV SEGV_ACCERR

iphone - bundle 访问中的sqlite db路径?