Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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_Nslog - Fatal编程技术网

Objective c NSLog对象';重写描述方法中的内存地址

Objective c NSLog对象';重写描述方法中的内存地址,objective-c,nslog,Objective C,Nslog,我正在重写对象的描述方法。我需要知道如何打印对象的内存地址以替换以下代码中的{???}: -(NSString *) description { return [NSString stringWithFormat:@"<SomeClass: %@>\nparmeterOne: %@\nparameterTwo: %@", {???}, self.parameterOne, self.paramterTwo]; } -(NSString*)说明{ 返回

我正在重写对象的描述方法。我需要知道如何打印对象的内存地址以替换以下代码中的{???}:

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %@>\nparmeterOne: %@\nparameterTwo: %@",
            {???}, self.parameterOne, self.paramterTwo];
}
-(NSString*)说明{
返回[NSString stringWithFormat:@“\n参数一:%@\n参数二:%@”,
{???},self.parameterOne,self.parametertwo];
}
我希望它在控制台中打印如下:

<SomeClass: 0x4c05600> parameterOne: 12 parameterTwo: sausages
参数一:12参数二:香肠

要打印地址,请使用
%p
格式说明符和自指针:

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %p>\nparmeterOne: %@\nparameterTwo: %@",
            self, self.parameterOne, self.paramterTwo];
}
-(NSString*)说明{
返回[NSString stringWithFormat:@“\n参数一:%@\n参数二:%@”,
self,self.parameterOne,self.parametertwo];
}
最简单的方法是使用超级描述 因此,在这个模型对象是NSObject的子类的情况下,您可以避开额外的工作并记住
%p

手动使用NSStringWithClass()和%p
-(NSString*)说明
{
返回[NSString stringWithFormat:@“区域:%@,%@”,NSStringFromClass([self class]),self,self.identifier,self.name];
}

因此,如果对象模型中有一个从该类派生的具体实现者,则将显示正确的类名。

使用self和“%@”说明符确实会导致递归,因为这将使-description方法再次调用。%p说明符只输出指针地址我倾向于
[NSString stringWithFormat:@“%@parameterOne:…”,[super description],…]
-地址在那里结束,因为
NSObject
拥有它,但您也不会丢弃任何您认为与您可能继承的任何超类中的调试相关的内容。另外注意:
%p
需要类型为
void*
的指针,您必须将
self
转换回
void*
,您必须将
转换回
void*
,否则将发生未定义的行为。@user529758:无需强制转换,无未定义的行为
void*
id
在内部几乎是相同的,在这种情况下,将其转换为
void*
与否没有区别。必须在“self”参数之前加上“&”符号
- (NSString *)description
{
    return [NSString stringWithFormat:@"%@ Area: %@, %@", [super description], self.identifier, self.name];
}
- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@: %p> Area: %@, %@", NSStringFromClass([self class]), self, self.identifier, self.name];
}