- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Mac OS X 10.6,Cocoa 项目,带有保留/释放 gc
我有一个函数:
例如(为简洁起见,删除了错误处理)。
NSMutableArray * ListAllSubFoldersForFolderPath(NSString *folderPath)
{
NSMutableArray *a = [NSMutableArray arrayWithCapacity:100];
NSString *itemName = nil;
NSFileManager *fm = [NSFileManager defaultManager];
NSDirectoryEnumerator *e = [fm enumeratorAtPath:folderPath];
while (itemName = [e nextObject]) {
NSString *fullPath = [folderPath stringByAppendingPathComponent:itemName];
BOOL isDirectory;
if ([fm fileExistsAtPath:fullPath isDirectory:&isDirectory]) {
if (isDirectory is_eq YES) {
[a addObject: fullPath];
}
}
}
return a;
}
调用函数在每个 session 中仅获取一次数组,并将其保留以供以后处理:
static NSMutableArray *gFolderPaths = nil;
...
gFolderPaths = ListAllSubFoldersForFolderPath(myPath);
[gFolderPaths retain];
现阶段一切看起来都很好。 [gFolderPaths count] 返回找到的正确路径数,[gFolderPaths description] 打印出所有正确的路径名称。
问题:
当我稍后使用gFolderPaths时(例如,下一次运行我的事件循环),我的断言代码(以及 Xcode 中的 gdb)告诉我它是 nil。
在最初的抓取之后我没有以任何方式修改gFolderPaths,所以我假设我的内存管理被搞砸了并且gFolderPaths正在被运行时释放。
我的假设/假设
当我将每个字符串添加到可变数组时,我不必保留它,因为这是自动完成的,但一旦它从函数移交给我,我就必须保留该数组,因为我不会立即使用它。这是正确的吗?
感谢任何帮助。
最佳答案
对象不会“go nil
”。
static NSMutableArray *gFolderPaths = nil;
此声明声明 gFolderPaths
是一个保存指向 NSMutableArray 对象的指针的变量。您可以使用指向无对象的指针来初始化它:nil
。
此初始化是有效的,并且是有意义的,因为您还没有可以放在这里的数组 - 最好使用 nil
指针进行初始化,而不是不初始化并冒一些随机指针出现在数组中的风险多变的。 (static
变量不会发生这种情况,因为 static
变量无论如何都会被初始化为 nil
,但显式性很好,并且显式初始化是无害。)
When I go to use
gFolderPaths
later (say, the next run through my event loop) my assertion code (and gdb in Xcode) tells me that it isnil
.I am not modifying
gFolderPaths
in any way after that initial grab, so I am presuming that my memory management is screwed and thatgFolderPaths
is being released by the runtime.
没有。运行时不会释放对象。运行时是语言的一部分,retain
和 release
是 Foundation 框架的一部分。该框架位于语言之上。
因此,您可能会猜测您或某些其他代码(例如,在框架中)释放了您之前存储在 gFolderPaths
中的指针的对象。
没有。如果发生这种情况,gFolderPaths
变量不会突然包含 nil
;它仍然包含指向同一对象的相同指针。如果这是对象死亡前的最后一次发布,则 gFolderPaths 变量仍将包含指向同一个现已死亡的对象的相同指针。
尝试记录指针(例如,使用 NSLog(@"%p", gFolderPaths)
)将打印看起来有效的地址,例如 0x2381ab6780
。尝试记录该对象(例如,使用 %@
)几乎肯定会崩溃,因为该对象已死亡。
事实并非如此。您说您的断言和对调试器的命令显示 gFolderPaths
变量包含 nil
。
有两种明显的可能性:
nil
,要么您从未分配过任何内容。您说您正在记录将其指针分配给变量的数组,并且说明已检查完毕,因此我们可以完全排除这种可能性。 (记录计数的测试不太可靠,因为 [nil count]
将成功返回 0。)这导致了第三种可能性:
3. 您有两个 gFolderPaths
变量。
我猜您有两个函数或方法(或每个函数或方法之一)都包含此行:
static NSMutableArray *gFolderPaths = nil;
那是行不通的。两个 gFolderPaths 变量都是静态的,但对于您在其中声明它们的函数/方法来说也是本地的。每个函数/方法都有自己的 gFolderPaths 变量,因此您有两个这样的变量,彼此分开。
您需要将 gFolderPaths
声明为静态全局变量,位于任何函数或方法之外。更好的是,如果仅从实例访问它,请将其设为实例变量。无论哪种方式,如果您想在两个函数或方法之间共享它,它都不能是局部变量。
发生这种情况的另一种情况是,如果您有两个这样的全局声明,但每个声明都位于不同的文件中。在文件作用域声明的变量上的 static
意味着“仅在该文件内可见”,因此这会导致相同的问题:当您想要拥有一个共享变量时,会出现两个单独的变量。如果这是您的问题,立即的解决方法是从它们中删除 static
关键字,但如果您打算以这种方式使用全局变量,则应该重新考虑您的设计。
关于Cocoa 内存管理 - 对象在我身上为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3051426/
我是 Mac OS X 开发新手。在 XCode/Cocoa 开发环境中,每个 Objective-C 项目都以 开始 #import 它工作正常,但我对 Cocoa.h 文件位置感到困惑。我的文件
所以我开始阅读这本书: http://www.amazon.com/Cocoa-Design-Patterns-Erik-Buck/dp/0321535022 第 2 章解释了 MVC 设计模式,并给
我使用下面的代码来访问项目中的变量 appDelegate =(AppDelegate *)[[UIApplication sharedApplication] delegate]; UIApplic
我想从我的表格 View 中拖动一行并将其放入 Mac OS X 10.6 中的任何其他 NSTextField 中,并放置一串文本。 拖放已经在我的应用程序中工作(在 NSTableView 和 N
如何在另一个窗口中加载 Nib ? 我尝试了 initWithWindowName, if (mmController == NULL) mmController = [[mainMenu a
其中一个类使用#import 。所以,在我的Podspec ,我包括 framework Cocoa 我的Podspec是 Pod::Spec.new do |s| s.name
有没有可以让我创建简单的条形图和折线图的框架? 最佳答案 有更新的开源Core Plot。 关于cocoa - cocoa :创建图表,我们在Stack Overflow上找到一个类似的问题: htt
如何从 SIMBL 插件获取主应用程序中的单例?当我尝试调用诸如 [ProcessControl sharedInstance] 之类的内容时,我收到一条错误,指出 ProcessControl 未定
我正在尝试从我的 cocoa 应用程序(通过使用 Mail.app)发送电子邮件中的一些文本。最初我尝试使用 HTML 发送格式正确的文本。但 mailto: URL 不支持 html 标签(即使在设
我正在创建一个应用程序,该应用程序必须与服务器数据交互,然后相应地显示数据库中的结果。我正在用 Cocoa 编写客户端应用程序。 示例:用户登录到 Web 应用程序。他们有一些提交网络报告的选项。选项
我想创建一个可以在多个应用程序中使用的框架(如 coreData、CoreAudio 等)。 任何人都可以发布此链接或教程... 最佳答案 尝试苹果的 Framework Programming Gu
我正在使用 [[NSFontManager sharedFontManager] collectionNames] 获取所有集合,但我看到一些未翻译的字符串(例如“com.apple.AllFonts
我刚刚开始我的 cocoa 教育,我有一个简单的问题,我看到单击一个单词并使用 mac 文本转语音功能的能力表明文本是自动内置的。 (即 - 对于 hello world 应用程序,您可以单击 hel
我需要在加密中实现盐,但要做到这一点,我需要将其存储为我需要创建的文件格式,以便稍后检索它进行解密。在加密方面我是个菜鸟。文件格式规范如下: 密文:密文长度;salt:盐的长度; 然后将密文和盐写出来
有没有办法在Cocoa中以任意的能力创建贝塞尔路径?例如,对于我的应用程序的一部分,我需要一个起伏的单元格。因此,我想使用 10 到 50 个不同的点绘制一条曲线,形成一个循环。这些点将随机波动。我认
我想将声音存储在用户默认值中。既然我们不能直接存储语音,那么存储它的最佳方式是什么?安装新语音后,使用数组 [NSSpeechSynthesizer availableVoices] 中的索引可能会有
我一直在寻找解决方案,但不知道是否可以执行以下操作: 我有一个drawRect方法,我想要做的是将图形元素(例如矩形和线条)添加到当前 View 而不刷新它。我曾经调用 setNeedsDisplay
美好的一天! 我正在为 Mac OS X(不是 iPhone)开发提醒软件。它应该一天一次显示一个窗口。具体时间没有规定,只是一次。我怎样才能做到呢。它会自行注册以在登录后启动。我已经尝试过 NSTi
我只是想知道是否可以创建具有层次结构的下拉或弹出菜单?我目前正在开发的应用程序跟踪作业、类(class)和主题。当用户创建作业时,他们需要能够从下拉列表中选择它所属的类(class),但我也不希望通过
是否有任何 Cocoa Widget 可以用来构建典型的(除了 Interface Builder 中的)GUI 构建器属性检查器,例如 RealBasic 或 Delphi? 是否有一个网站列出了其
我是一名优秀的程序员,十分优秀!