黑马程序员-------description

本文深入探讨了iOS开发及Objective-C编程技巧,包括描述方法的使用、对象输出结果定制及避免死循环陷阱等核心内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------- IOS开发IOS培训、期待与您交流! -------


1. -description方法

使用NSLog%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出

2. + description方法

使用NSLog%@输出某个类对象时,会调用类对象+description方法,并拿到返回值进行输出

3. 修改NSLog的默认输出

重写-description或者+description方法即可

4. 死循环陷阱

如果在-description方法中使用NSLog打印self

------------------------------------------------------------------------------------------------

 #import <Foundation/Foundation.h>

@interface Person : NSObject

@property int age;

@property NSString *name;

@end

--------------------------------------------------------------------------------------------------

#import "Person.h"


@implementation Person


// 决定了实例对象的输出结果

//- (NSString *)description

//{

//    // 下面代码会引发死循环

//    // NSLog(@"%@", self);

//    return [NSString stringWithFormat:@"age=%d, name=%@", _age, _name];

//    //return @"3424324";

//}


// 决定了类对象的输出结果

+ (NSString *)description

{

    return @"Abc";

}

@end

----------------------------------------------------------------------------------------------

#import <Foundation/Foundation.h>

#import "Person.h"

void test9()

{

    // 输出当前函数名

    NSLog(@"%s\n", __func__);

}


int main()

{

    // 输出行号

    NSLog(@"%d", __LINE__);

    

    // NSLog输出C语言字符串的时候,不能有中文

    // NSLog(@"%s", __FILE__);

    

    // 输出源文件的名称

    printf("%s\n", __FILE__);

    

    test9();

    

    Person *p = [[Person alloc] init];

    

    // 指针变量的地址

    NSLog(@"%p", &p);

    // 对象的地址

    NSLog(@"%p", p);

    // <类名:对象地址>

    NSLog(@"%@", p);

   

    return 0;

}


void test2()

{

    Class c = [Person class];

    

    // 1.会调用类的+description方法

    // 2.拿到+description方法的返回值(NSString *)显示到屏幕上

    NSLog(@"%@", c);

}


void test1()

{

    Person *p = [[Person alloc] init];

    p.age = 20;

    p.name = @"Jack";

    // 默认情况下,利用NSLog和%@输出对象时,结果是:<类名:内存地址>

    

    // 1.会调用对象p的-description方法

    // 2.拿到-description方法的返回值(NSString *)显示到屏幕上

    // 3.-description方法默认返回的是“类名+内存地址”

    NSLog(@"%@", p);

    

    //Person *p2 = [[Person alloc] init];

    //NSLog(@"%@", p2);

    

    //NSString *name = @"Rose";

    

    //NSLog(@"我的名字是%@", name);

    

    Person *p2 = [[Person alloc] init];

    p2.age = 25;

    p2.name = @"Jake";

    

    NSLog(@"%@", p2);

}

### C++ 分布式网络通信框架推荐 在开发分布式系统时,选择合适的框架对于系统的性能、可扩展性和维护性至关重要。以下是几个适合 C++ 开发的分布式网络通信框架及其特点: #### 1. **Mprpc** Mprpc 是一个基于 Protobuf 的分布式 RPC 框架[^4]。它的主要特性包括: - 使用 Google Protocol Buffers 进行高效的数据序列化和反序列化。 - 支持 ZooKeeper 作为服务注册中心,便于实现服务发现。 - 基于 Muduo 网络库构建,提供了高效的异步 I/O 处理能力。 - 实现了单线程异步日志记录功能。 代码示例展示了如何通过 `SendRpcResponse` 函数将响应序列化并发送给客户端[^3]: ```cpp void RpcProvider::SendRpcResponse(const muduo::net::TcpConnectionPtr& conn, google::protobuf::Message *response) { std::string response_str; if (response->SerializeToString(&response_str)) { // 将消息对象序列化为字符串 conn->send(response_str); // 发送序列化的数据到客户端 } else { std::cout << "serialize response_str error!" << std::endl; // 如果序列化失败则打印错误信息 } conn->shutdown(); // 主动关闭连接模拟 HTTP 短链接行为 } ``` #### 2. **Thrift** Apache Thrift 是另一个广泛使用的跨语言 RPC 框架,支持多种编程语言,其中包括 C++[^2]。其核心优势在于: - 提供了一种 IDL(接口定义语言),允许开发者定义服务接口和服务端/客户端自动生成代码。 - 数据传输采用紧凑的二进制格式,相比 JSON 或 XML 更加高效。 - 能够轻松集成到现有的 C++ 工程中,并且具备良好的社区支持。 #### 3. **gRPC** 尽管 gRPC 最初是由谷歌设计并主要用于 Go 和 Java 编程语言,但它同样也支持 C++ 平台上的开发工作流。关键亮点如下: - 利用了 Protocol Buffers 作为默认的消息传递机制。 - 内置负载均衡、认证授权等功能组件。 - 对现代 C++ 特性的良好适配使得编写高性能的服务变得更加容易。 #### 4. 自定义轻量级 RPC 框架 如果现有开源解决方案无法完全满足特定业务场景的需求,则可以考虑自行研发定制版 RPC 架构。例如,在上述提到的文章里作者分享了自己的实践经历——创建名为 yyg_rpc_server 的简易版本[^1]。该项目虽然目前仍处于早期阶段但已经涵盖了基本的功能模块如同步请求处理等基础要素。 综上所述,无论是选用成熟的第三方工具还是尝试打造专属方案都需要依据实际应用场景做出权衡考量。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值