Objective-C 语法之 Debug 表达式

Objective-C调试技巧
本文介绍了一个Objective-C程序中使用预定义宏和Core Foundation方法来进行调试的方法。通过具体示例展示了如何利用__func__、__PRETTY_FUNCTION__等系统预留定义词以及NSStringFromSelector等Core Foundation方法获取运行时的函数名、文件名、行号等信息。

main.m

 1 #import <Foundation/Foundation.h>
 2 #import "TestClass.h"
 3 
 4 int main(int argc, const char * argv[]) {
 5     @autoreleasepool {
 6         NSString *purposeInfo = @"拿到的信息不仅在Debug中有用,而且在selector的传递也很有用";
 7         [TestClass testDebugKeyword:purposeInfo];
 8     }
 9     return 0;
10 }

TestClass.h

1 #import <Foundation/Foundation.h>
2 
3 @interface TestClass : NSObject
4 + (void)testDebugKeyword:(NSString *)purposeInfo;
5 
6 @end

TestClass.m

 1 #import "TestClass.h"
 2 
 3 @implementation TestClass
 4 
 5 + (void)testDebugKeyword:(NSString *)purposeInfo {
 6     NSMutableString *mStrInfo = [[NSMutableString alloc] initWithString:purposeInfo];
 7     [mStrInfo appendString:@"\n\nDebug时一些系统预留定义词的用法如下:\n"];
 8     [mStrInfo appendFormat:@"__func__: %s\n", __func__];
 9     [mStrInfo appendFormat:@"__PRETTY_FUNCTION__: %s\n", __PRETTY_FUNCTION__];
10     [mStrInfo appendFormat:@"__LINE__: %d\n", __LINE__];
11     [mStrInfo appendFormat:@"__FILE__: %s\n", __FILE__];
12     
13     [mStrInfo appendString:@"\n\nDebug时一些Core Foundation方法的用法如下:\n"];
14     [mStrInfo appendFormat:@"NSStringFromSelector(_cmd): %@\n", NSStringFromSelector(_cmd)];
15     [mStrInfo appendFormat:@"NSStringFromClass([self class]): %@\n", NSStringFromClass([self class])];
16     [mStrInfo appendFormat:@"[[NSString stringWithUTF8String:__FILE__] lastPathComponent]: %@\n", [[NSString stringWithUTF8String:__FILE__] lastPathComponent]];
17     
18     NSLog(@"%@", mStrInfo);
19 }
20 
21 @end

 

结果:

 1 2015-06-20 11:07:16.353 OCDebugKeyword[465:18859] 拿到的信息不仅在Debug中有用,而且在selector的传递也很有用
 2 
 3 Debug时一些系统预留定义词的用法如下:
 4 __func__: +[TestClass testDebugKeyword:]
 5 __PRETTY_FUNCTION__: +[TestClass testDebugKeyword:]
 6 __LINE__: 18
 7 __FILE__: /Users/Kenmu/Documents/iOSDevelopment/OCDebugKeyword/OCDebugKeyword/TestClass.m
 8 
 9 
10 Debug时一些Core Foundation方法的用法如下:
11 NSStringFromSelector(_cmd): testDebugKeyword:
12 NSStringFromClass([self class]): TestClass
13 [[NSString stringWithUTF8String:__FILE__] lastPathComponent]: TestClass.m

 

<think>我们正在处理用户关于Objective-C的请求。根据对话历史,用户之前询问了FastReport VCL,但当前问题转向了Objective-C教程和最佳实践。用户提供了两个引用,但引用内容与Objective-C相关,因此我们需要调整回答方向。 用户引用[1]提到了Objective-C面向对象编程的教程,包括类、对象、方法,以及环境搭建。引用[2]提到了如何快速掌握Objective-C,特别是Foundation框架的常用类(如NSString, NSArray, NSDictionary)和方法。 因此,我们应该围绕以下内容构建回答: 1. 学习Objective-C的原因(如iOS/macOS开发) 2. 环境搭建(Xcode) 3. 基础语法(类、对象、方法) 4. Foundation框架的核心类 5. 最佳实践(如内存管理、命名约定、设计模式) 同时,注意用户要求生成相关问题。 系统指令要求: - 行内数学表达式用$...$(但Objective-C中可能较少,若有计算相关可加入) - 独立公式用$$...$$(同样,可能较少) - 使用中文 - 引用标记[^1]等(但用户提供的引用是优快云博客,我们可以在回答中引用这些链接作为参考) 然而,请注意,用户提供的引用[1]和[2]是优快云博客文章,我们可以将它们作为参考资料,但也要注意补充其他官方资源(如苹果官方文档)和最佳实践。 回答结构建议: 1. 为什么学习Objective-C 2. 环境搭建(Xcode) 3. 基础语法(类、对象、方法)示例 4. Foundation框架常用类 5. 内存管理(MRC/ARC) 6. 最佳实践(如使用属性、委托模式、命名规范) 7. 学习资源推荐(包括用户提供的优快云链接) 最后,生成相关问题。 注意:用户提供的引用链接有两个,分别是: [1] https://shuaici.blog.youkuaiyun.com/article/details/148535298 [2] https://shuaici.blog.youkuaiyun.com/article/details/60570837 (注意,这个链接实际上是关于C语言的,但用户引用[2]的文本中提到了如何快速掌握Objective-C,所以可能是用户引用标记有误?) 根据用户引用[2]的文本,它说的是“如何快速掌握objective-c语言。掌握Foundation框架:...”,但链接却是C语言基础。因此,我们在回答中主要参考引用[1]的内容,对于Foundation框架部分,我们可以结合引用[2]的描述(尽管链接是C语言,但文本描述是Objective-C),但为了准确,我们可能直接引用该链接,而是作为一般性建议。 因此,我们这样安排引用: - 在环境搭建和基础语法部分,可以引用[1] - 在Foundation框架部分,我们可以提到引用[2]中描述的方法(但链接对应,所以我们可以标记引用[2]的链接,或者忽略引用[2]的链接,只使用其文本描述作为一般性内容) 为了可靠,我们主要使用引用[1]的链接,并在Foundation框架部分建议参考苹果官方文档和引用[1]的教程。 具体回答结构如下:</think>### Objective-C 教程与最佳实践 Objective-C 是 iOS/macOS 开发的核心语言,结合了 C 语言的高效性和 Smalltalk 的面向对象特性。以下是系统学习路径和行业最佳实践: --- #### **一、为什么学习 Objective-C?** 1. **可替代性** - 维护遗留 iOS/macOS 应用(如银行、医疗系统)[^1] - 深入理解 Swift 底层机制(Swift 与 Objective-C 互操作) 2. **技术优势** - 动态运行时(Runtime)支持方法交换、消息转发 - 成熟的 Cocoa/Cocoa Touch 框架生态 --- #### **二、环境搭建与基础语法** 1. **开发环境** ```bash # 安装 Xcode 命令行工具 xcode-select --install ``` - 使用 Xcode 创建项目:选择 `Objective-C` 模板 2. **核心语法** ```objectivec // 类声明(.h 文件) @interface Person : NSObject @property (nonatomic, copy) NSString *name; - (void)sayHello; // 实例方法 + (void)species; // 类方法 @end // 实现(.m 文件) @implementation Person - (void)sayHello { NSLog(@"Hello, %@!", self.name); // 输出:Hello, Alice! } @end // 调用 Person *alice = [[Person alloc] init]; alice.name = @"Alice"; [alice sayHello]; ``` - 关键点:`@property` 自动生成 getter/setter,`NSLog` 替代 `printf`[^1] --- #### **三、Foundation 框架核心类** [^2] | 类名 | 用途 | 示例代码片段 | |---------------|-----------------------|----------------------------------| | `NSString` | 可变字符串 | `NSString *str = @"Objective-C";` | | `NSArray` | 对象数组 | `NSArray *arr = @[@1, @2, @3];` | | `NSDictionary`| 键值对集合 | `@{@"key": @"value"}` | | `NSData` | 二进制数据容器 | 文件读写/网络传输 | > **最佳实践**:优先使用字面量语法(`@[]`, `@{}`)提高可读性和安全性。 --- #### **四、内存管理最佳实践** 1. **MRC 到 ARC 的演进** - ARC(自动引用计数)已取代手动 MRC - 循环引用解决方案: ```objectivec @property (nonatomic, weak) id delegate; // 弱引用打破循环 ``` 2. **内存调试技巧** - Xcode 工具:`Debug Memory Graph` 检测内存泄漏 - 使用 `__weak` 和 `__strong` 明确所有权 --- #### **五、设计模式与架构** 1. **MVC 模式** - **Model**:数据层(`NSManagedObject`) - **View**:界面元素(`UIView`/`NSView`) - **Controller**:协调层(`UIViewController`) 2. **委托模式(Delegation)** ```objectivec @protocol NetworkDelegate <NSObject> - (void)didReceiveData:(NSData *)data; @end @interface NetworkManager : NSObject @property (nonatomic, weak) id<NetworkDelegate> delegate; @end ``` --- #### **六、学习资源推荐** 1. **官方文档** - [Objective-C 编程语言指南](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html) 2. **实战教程** - [Objective-C 高级编程:iOS 与 OS X 多线程和内存管理](https://book.douban.com/subject/24720270/) 3. **社区资源** - Stack Overflow 标签:[objective-c](https://stackoverflow.com/questions/tagged/objective-c) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值