目标C:仅获取对象的地址

时间:2013-07-04 13:02:20

标签: ios debugging

当我使用

NSLog("view = %@", view)

我会得到类似的结果:

UIImageView: 0x79908a0; frame = (0 0; 320 548); clipsToBounds = YES; opaque = NO; gestureRecognizers = <NSArray: 0x7969370>; layer = <CALayer: 0x79900f0>

但我只是视图的地址:

UIImageView: 0x79908a0

有可能处理吗?

3 个答案:

答案 0 :(得分:4)

您可以使用%p格式(以0x...格式打印任何指针的内容):

NSLog("view = %p", view)
// Output: view = 0x79908a0

答案 1 :(得分:0)

UIView *obj = [[UIView alloc]initWithFrame:CGRectMake(10, 10, 10, 10)];
NSString *addr = [NSString stringWithFormat:@"%p", obj];
NSLog(@"Address is = %@",addr);

使用%p格式化程序获取对象的地址。结果将是以0x十六进制开头的字符串。

答案 2 :(得分:0)

NSString:当你将类的实例传递给NSLog时,描述就是在类上调用的内容,所以你可以覆盖它来生成你喜欢的任何东西。

如果你真的想要这样做,你可以覆盖一个类别中的UIView描述类,并忽略这样的警告:

注意:此行为未定义:“如果在类别中声明的方法的名称与原始类中的方法相同...则在运行时使用哪种方法实现的行为未定义”。因此,您自担风险使用!

@interface UIView (Overide)
@end

@implementation UIView (Overide)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
- (NSString *) description {
    return [NSString stringWithFormat:@"%@: %p", NSStringFromClass(self.class), self];
}
#pragma clang diagnostic pop

@end

您只需要将其导入预编译头文件(.pch),它就会立即生效到您的整个项目中。