我有一个在Xcode动态库目标中引用的符号,但它没有在那里定义.我需要这个符号未定义.这是因为它将在包含它的每个进程中进行不同的编译(基于一些编译时定义).
Xcode中的动态库目标无法链接,因为它包含对此符号的引用(这不是意外),但我知道该符号将在运行时可用.我将把这个函数编译到公共库链接到的每个目标中.
我试图让链接器在运行时标记此特定符号以进行动态查找.
如果我在我的Xcode项目中将"-undefined dynamic_lookup"指定为"其他链接器标志"之一,我就能够将其链接起来.问题是我不想走那么远.我知道只有1个符号应该是未定义的.如果它们被保留为未定义,我希望所有其余符号生成错误(我希望基本上避免运行时遗漏符号错误).
我找到了一个ld链接器选项,看起来它应该做我需要的(从ld手册页):
-U symbol_name
Specified that it is ok for symbol_name to have no definition. With -two_levelnamespace, the resulting symbol will be marked dynamic_lookup which means dyld will search all loaded images.
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法让它发挥作用.每当我在"其他链接器标志"中指定"-U symbolName"或"-UsymbolName"时,我仍然会遇到此链接器错误:
Undefined symbols for architecture x86_64:
"_symbolName", referenced from: <various object files>
Run Code Online (Sandbox Code Playgroud)
我可能错误地使用了-U吗?它不是我真正需要的选择,还是它不像它应该的那样工作?
我正在设置一个计时器来运行未来的特定功能,如下所示:
pingTimer = [[NSTimer alloc] initWithFireDate:pingAtDate
interval:0
target:self
selector:@selector(ping:)
userInfo:nil
repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:pingTimer forMode:NSDefaultRunLoopMode];
Run Code Online (Sandbox Code Playgroud)
日期约为未来一周,因此出于测试目的,我(和其他人)已将系统时钟设置为8天,以确保指定的事件发生.问题是它不会发生.
在将来安排几分钟时,我发现计时器仍然会关闭,但它会在特定的分钟数后熄灭.假设我将计时器安排在将来5分钟的日期,然后我将时钟设置为1小时,计时器确实在5分钟后启动,但是因为我将时钟向前设置1小时它发射的时间不再对齐随着计划开火的时间.
这不是我期望发生的事情,因为我称之为"initWithFireDate".
虽然所有这些对我来说似乎都是错误的(并且对其他人来说可能是一个有趣的观察),但问题是我如何确保计时器在发现过去发生火灾时立即触发(即如何确保我的当有人将时钟移动超过预定的发射日期时,计时器将会触发.
我有兴趣在OSX上迭代所有挂载的文件系统(目前运行10.9 Mavericks).我正在寻找类似于getmntent()或mount shell命令的输出(尽管我想从目标C中执行此操作,因此解析shell命令的输出显然不是最佳的).
我一直在查看磁盘仲裁框架,看来我可以使用此框架通知mount和unmount事件.我可能在那里遗漏了一些东西,但我不清楚是否有办法使用磁盘仲裁迭代现有的已安装文件系统.
我已经探索过使用getfsent(),它似乎会提供一个解决方案,但经过测试后我发现我没有从迭代getfsent()获得多个条目.请参阅以下代码:
struct fstab* fsentry;
setfsent();
fsentry = getfsent();
while(fsentry)
{
//do something with fsentry
fsentry = getfsent();
}
endfsent();
Run Code Online (Sandbox Code Playgroud)
我到这里的唯一条目是/ file系统.第二次调用getfsent()时,它返回NULL,好像没有更多的条目.mount命令向我展示了其他几个包括已安装的cifs/smb文件系统:
/dev/disk0s2 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)
//user@<ip address>/public on /Volumes/public (smbfs, nodev, nosuid, mounted by user)
Run Code Online (Sandbox Code Playgroud)
所以似乎getfsent()开始做我期望的,但由于某种原因停止?
总结我的问题是:在OSX上迭代文件系统的最佳方法是什么?
如果有人对我为什么只从getfsent()获得一个结果的答案,我也会对此感兴趣.
我已经通过在应用程序info.plist中添加NSService条目(如http://www.macosxautomation.com/services/learn/)创建了一个用于公开某些文件的OSX服务的应用程序,但是安装后发现应用程序在新计算机上的服务不会在查找器的右键单击上下文菜单中快速显示。
我知道这是因为粘贴板服务尚未重新索引/ Applications文件夹并“发现”新安装的服务。
我也知道我可以通过手动运行/ System / Library / CoreServices / pbs来强制重新索引和发现。
这里的问题是,对于首次安装我的应用程序的用户而言,确保我的服务尽快显示的最佳方法是什么。
我的应用程序启动时,我可以执行对“ / System / Library / CoreServices / pbs”的系统调用-如果用户立即启动我的应用程序-,但这只能部分解决问题(此外,我想知道是否存在更好的基于Cocoa API的方法)。
如果通常只通过上下文菜单访问我的应用程序,则用户永远不会想到要首先启动该应用程序。他们只会在上下文菜单不存在时认为它坏了。
我没有通过安装程序分发我的应用程序。我只是提供一个可以拖放到/ Applications中的捆绑包(正如我认为Apple通常建议的那样)。
以这种方式进行安装时,是否有一种方法可以加快服务发现的过程,从而使用户在任何时间都没有新安装的服务?
作为附带说明,该问题似乎在10.8中可能不存在(或至少明显存在)。Apple可能在其最新版本中更快地完成了此索引编制。
我几乎可以肯定我在这段代码中没有泄漏,但Xcode分析器报告存在"潜在"泄漏(Xcode 4.6.1).
+ (MySHA1hash *)sha1HashWithHashBytes:(unsigned char *)hash length:(unsigned int)length;
{
return [[[MySHA1hash alloc] initWithHashBytes:hash length:length] autorelease];
}
Run Code Online (Sandbox Code Playgroud)
如果问题是Xcode报告误报,我想弄清楚如何构建代码以使警告静音.
也有可能我以一种我不理解的方式泄漏,但如果有人能看到我实际上是如何泄漏,我也很乐意得到这些反馈.
这必须与我调用的init函数有关,因为如果我只是用init替换initWithHashBytes,则不再报告泄漏.为此,我还包括initWithHashBytes的主体.
- (id)initWithHashBytes:(unsigned char *)hash length:(unsigned int)length
{
if (hash != nil && length <= SHA_DIGEST_LENGTH) {
NSData *data = [NSData dataWithBytes:hash length:length];
self = [self initWithHash:data];
}
else {
self = nil;
}
return self;
}
- (id)initWithHash:(NSData *)hash
{
if ([hash length] <= SHA_DIGEST_LENGTH && (self = [super init]) != nil) {
finished = YES;
[hash getBytes:sha_Result];
hashValue = …
Run Code Online (Sandbox Code Playgroud)