尝试打印单个未格式化的整数时NSLog给出错误

时间:2014-01-06 06:27:45

标签: ios objective-c nslog

嗨,这是我今天使用Objective-C的第三天,我写了几个简单的程序,我发现了以下警告

main.m:19:5:警告:传递'NSLog'的参数1使得整数指针没有强制转换[默认启用]      的NSLog(RES);

最终导致分段错误 ..这是我的程序..

#import <Foundation/Foundation.h>
@interface SomeClass: NSObject
{
    int x;
}
@property int x;
@end

@implementation SomeClass

@synthesize x;
@end

int main(){ 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc]init];
SomeClass * obj = [[SomeClass alloc]init];
obj.x =20;
int res = obj.x;
NSLog(res); //error
/* But the error was not seen when I replaced the above statement with 
 NSLog(@"The value is : %d",res);
 */
[pool drain];
return 0;
}

我收到的错误消息是:

Compiling the source code....
$gcc `gnustep-config --objc-flags` -L/usr/GNUstep/System/Library/Libraries -lgnustep-base main.m -o demo -lm -pthread -lgmpxx -lreadline 2>&1
main.m: In function 'main':
main.m:19:5: warning: passing argument 1 of 'NSLog' makes pointer from integer without a cast [enabled by default]
     NSLog(res);
     ^
In file included from /usr/GNUstep/System/Library/Headers/Foundation/NSObject.h:30:0,
                 from /usr/GNUstep/System/Library/Headers/Foundation/FoundationErrors.h:29,
                 from /usr/GNUstep/System/Library/Headers/Foundation/Foundation.h:33,
                 from main.m:1:
/usr/GNUstep/System/Library/Headers/Foundation/NSObjCRuntime.h:146:16: note: expected 'struct NSString *' but argument is of type 'int'
 GS_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
                ^

Executing the program....
$demo 
Segmentation fault (core dumped)

请帮助我理解为什么NSLog会像这样?我哪里做错了? 谢谢......

5 个答案:

答案 0 :(得分:2)

你不能像这样使用NSLog,你需要指定控制字符串并使用如下:

NSLog(@"%d",res);

应为NSLog()指定格式,请查看NSLog and NSLogv reference 以获取更多信息

  

的NSLog

     

将错误消息记录到Apple系统日志工具。

     

void NSLog ( NSString *format, ... );

     

<强>讨论

     

只需调用NSLogv,向其传递可变数量的参数。   可用性

     
     

NSLogv

     

将错误消息记录到Apple系统日志工具。

     

void NSLogv ( NSString *format, va_list args );

     

<强>讨论

     

将错误消息记录到Apple System Log工具(请参阅man 3   ASL)。如果已重定向STDERR_FILENO文件描述符   从默认情况下或者是tty,它也会写在那里。   如果要将输出定向到其他位置,则需要使用自定义   伐木设施。

     

该消息由时间戳和前缀为的进程ID组成   你传入的字符串。你用格式字符串组成这个字符串,   format,以及要插入到字符串中的一个或多个参数。该   这些函数允许的格式规范是   由NSString的格式化功能理解(不是   必须是printf理解的格式转义和标志的集合。   支持的格式说明符在“字符串格式”中描述   说明符”。如果出现错误消息,则会将最终的硬回车添加到错误消息中   格式不存在。

     

通常,您应该使用NSLog函数而不是调用它   功能直接。如果你直接使用这个功能,你必须有   通过调用在args参数中准备了变量参数列表   标准C宏va_start。完成后,您必须同样   为此列表调用标准C宏va_end。

     

NSLogv的输出是序列化的,因为进程中只有一个线程   可以一次进行上述的书写/记录。所有   尝试在下一个线程之前写入/记录消息   可以开始尝试。

     

NSLogv的影响不是用除了以外的子系统序列化的   上面讨论的那些(例如标准I / O包)并没有   对这些子系统产生副作用(例如导致缓冲   要刷新的输出,这可能是不合需要的)。可用性

答案 1 :(得分:0)

NSLog的第一个参数是NSString,它应该是一个包含0或更多格式说明符的字符串。

使用:

NSLog(@"res = %d", res);

或只是:

NSLog(@"%d", res);

详细了解NSLog的参考文档。

答案 2 :(得分:0)

您应该在Log中指定要打印哪种数据类型的编译器,

    NSLog(@"%d",res);

答案 3 :(得分:0)

您不应该直接使用NSLog(variable)。相反,使用NSLog(@"%d", variable)表示整数,或NSLog(@"%@", object)表示对象。

答案 4 :(得分:0)

您无法声明NSLog这样的NSLog教程可能对您有用。

Objective-C有许多内置数据类型:

int - 整数常量

float - 带小数分量的实数

双精度浮点数

char - 单个字符

short - 短整数(2个字节)

长 - 双倍短暂

多长 - 双长

BOOL - 布尔值

实用程序函数NSLog()可用于在Xcode中打印到调试控制台。 NSLog()使用NSString格式化服务。创建NSString的最简单方法是使用@”"表示法。在格式字符串中,%是值的占位符。 %之后的字符确定了预期的值,无论是int还是float等等。如果我们声明一个整数“int i = 5”并希望使用NSLog()打印i的值,我们可以使用NSLog(@”The value of i is %d”, i);

您可以使用%d打印int的值,%f表示浮点数,双倍,%c表示字符。有关NSString格式化方法支持的所有格式说明符的完整列表,请阅读文档。

更多参考Click Here

继续学习.. :)