Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSLog实际上做什么?_Objective C_Cocoa_Nslog - Fatal编程技术网

Objective c NSLog实际上做什么?

Objective c NSLog实际上做什么?,objective-c,cocoa,nslog,Objective C,Cocoa,Nslog,我有一个奇怪的问题。我在我的应用程序中使用了苹果私有框架中的一种方法。当我第一次调用它时,它工作了。当我第二次在没有中间任何东西的情况下立即调用它时,它崩溃了。但是,如果我将NSLog放在两个调用之间,它的工作效果会非常好。因此,我尝试删除NSLog并在它们之间放置循环、sleep()、printf(“…”)和fprintf(stderr,“…”),以模拟NSLog,但没有帮助。我想知道该方法如何知道我使用了NSLog?换句话说,NSLog实际上做了什么来影响方法的行为 多谢各位 编辑: 我似乎

我有一个奇怪的问题。我在我的应用程序中使用了苹果私有框架中的一种方法。当我第一次调用它时,它工作了。当我第二次在没有中间任何东西的情况下立即调用它时,它崩溃了。但是,如果我将NSLog放在两个调用之间,它的工作效果会非常好。因此,我尝试删除NSLog并在它们之间放置循环、sleep()、printf(“…”)和fprintf(stderr,“…”),以模拟NSLog,但没有帮助。我想知道该方法如何知道我使用了NSLog?换句话说,NSLog实际上做了什么来影响方法的行为

多谢各位

编辑:

我似乎解决了这个问题。我将在这里分享我的解决方案,并希望它可能对一些人有用

我正在使用MultitouchSupport.framework创建一个与多点触摸相关的应用程序。我从中复制了代码,并在循环末尾添加了一个
CFRelease
。因此,基本上,我的主要方法如下:

int main(void) { 
    int i; 
    NSMutableArray* deviceList = (NSMutableArray*)MTDeviceCreateList(); //grab our device list 
    for(i = 0; i<[deviceList count]; i++) { //iterate available devices 
        MTRegisterContactFrameCallback([deviceList objectAtIndex:i], touchCallback); //assign callback for device 
        MTDeviceStart([deviceList objectAtIndex:i], 0); //start sending events 
    }
    CFRelease((CFMutableArrayRef)deviceList); 
    printf("Ctrl-C to abort\n"); 
    sleep(-1); 
    return 0; 
}
但是,如果我将NSLog放在MTDeviceStart下面,它将不会崩溃

我在原始代码中添加了
CFRelease((CFMutableArrayRef)deviceList)
的原因是我认为从名为*Create*或*Copy*的函数创建的对象应该由我们自己发布。但事实证明,如果我像原始代码那样删除它,即使不使用NSLog,它也不会崩溃


那么,可能是因为我过早地发布了
deviceList
?但如果是这样,为什么NSLog似乎能够防止崩溃?

这可能是内存管理的问题:可能是一个无关的版本。如果您发布回溯,可能会对跟踪问题有所帮助。(事实证明,我关注的推特上有人昨晚提到了类似的事情)。

这需要很长时间。我不知道为什么。它打印日期/时间、进程名称、进程ID、线程ID和(最后)您要求的字符串。我认为它还将日志消息发送到syslogd(Xcode或iPCU的控制台将多行nslog显示为单个条目;我忘了是哪个条目);那里的IPC可能有重大影响


尝试使用syslog()(
#import
,然后使用
syslog(LOG\u INFO,“您好!”)
,如果它可以工作但没有输出,请尝试更改优先级(请参见
man 3 syslog
)。

类似于以下内容:

static inline void NSLogMessageString(NSString *string){
  NSString *date=[[NSDate date]
   descriptionWithCalendarFormat:@"%Y-%m-%d %H:%M:%S.%F"
                        timeZone:nil locale:nil];
  NSString *process=[[NSProcessInfo processInfo] processName];

  NSLogFormat(@"%@ %@[%d:%lx] %@",date,process,NSPlatformProcessID(),NSPlatformThreadID(),string);
}

void NSLogv(NSString *format,va_list arguments) {
  NSString *string=NSStringNewWithFormat(format,nil,arguments,NULL);

  NSLogMessageString(string);

 [string release];
}

void NSLog(NSString *format,...) {
  va_list arguments;

  va_start(arguments,format);

  NSLogv(format,arguments);
}

谢谢你问这个问题,lol,我想重写它,这样我就可以添加调试变量,这意味着我可以在需要时关闭所有NSLogging调用。

NSLog会影响像您遇到的问题一样的问题,因为它会影响线程的执行顺序,因为当您在后台线程中调用NSLog时,它必须获得独占性由于这个原因,访问stdout.printf调试线程的棘手问题通常会导致“Heisenbug”(即,当您尝试检查它们时,它们会改变行为).

Its可能与NSLog无关。我会发布一些代码。请将代码和堆栈跟踪编辑到您的问题中。您对命名约定的看法是正确的,但由于
MTDeviceCreateList
是一个私有函数,它可能违反/不符合它。(可能意味着“创建要在进程期间保持活动状态的设备数组,并返回指向它的指针”。)尝试运行程序(崩溃)在Instruments's Zombies instrument下。有了它,您应该能够证明您的发布是否是过度发布,或者以其他方式确定崩溃的真正原因。我猜
MT
函数不会保留您传递给它们的对象,因此如果您发布设备列表,它们会过早死亡。“创建”规则是一个碳规则,不是Cocoa规则。只有带有“alloc”、“new”和“copy”的函数才能将所有权传递给Cocoa中的调用方。是的,NSLog将消息发送给ASL,与syslog一样。我不确定您希望syslog做什么不同,只是不将其打印到stderr?我是在回答“如果我将NSLog放在两个调用之间,它会工作”,这表明syslog()可能会做一些NSLog所做的事情以使其“工作”.Wow!非常感谢。我尝试从代码中删除CFRelease,但现在效果很好。我不知道为什么。我刚刚在问题中添加了我的代码。请注意:如果发布太早,但无论如何都需要最终发布,这意味着现在它不是崩溃而是泄漏(即,如果是时间问题,并且您从一开始就拥有保留计数)
static inline void NSLogMessageString(NSString *string){
  NSString *date=[[NSDate date]
   descriptionWithCalendarFormat:@"%Y-%m-%d %H:%M:%S.%F"
                        timeZone:nil locale:nil];
  NSString *process=[[NSProcessInfo processInfo] processName];

  NSLogFormat(@"%@ %@[%d:%lx] %@",date,process,NSPlatformProcessID(),NSPlatformThreadID(),string);
}

void NSLogv(NSString *format,va_list arguments) {
  NSString *string=NSStringNewWithFormat(format,nil,arguments,NULL);

  NSLogMessageString(string);

 [string release];
}

void NSLog(NSString *format,...) {
  va_list arguments;

  va_start(arguments,format);

  NSLogv(format,arguments);
}