嗨,这是我今天使用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会像这样?我哪里做错了? 谢谢......
答案 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
继续学习.. :)