Objective-C结构体NSRange、NSPoint、NSSize与CGRect用法详解
在Objective-C程序开发中,处理视图布局、文本编辑以及动画轨迹时,频繁需要使用系统定义的基础结构体。本文深入解析NSRange、NSPoint、NSSize(及iOS下的CGSize)和CGRect这四个核心结构体的内存定义、快捷创建工厂函数以及日志输出技巧。
1. NSRange:表示范围区间
NSRange主要用于描述数据在序列中的位置跨度,例如字符串的子串截取或数组元素的提取。其内部仅包含两个NSUInteger类型的成员。
第1步:理解NSRange原型与构造
NSRange由“起点”和“长度”组成,直接赋值时需分别指定。推荐使用宏函数NSMakeRange进行初始化,代码更简洁:
// 直接定义并赋值
NSRange range;
range.location = 8;
range.length = 10;
// 使用工厂函数快速创建
range = NSMakeRange(8, 10); // location: 8, length: 10
第2步:打印与调试
由于NSRange是结构体而非对象,直接使用%@打印会报错。必须通过NSStringFromRange将其转换为可读的字符串:
NSString* str = NSStringFromRange(range);
NSLog(@"rang is %@", str);
2. NSPoint 与 CGPoint:定义二维坐标点
这两个结构体用于表示空间中的一个绝对位置(x轴与y轴)。在Mac OS X环境下常称NSPoint,在iOS环境下习惯使用别名CGPoint,两者实质相同。
第1步:坐标点的声明与创建
结构体定义包含CGFloat类型的横纵坐标:
struct CGPoint {
CGFloat x;
CGFloat y;
};
创建点位通常使用以下两种工厂函数,效果一致:
// 方式一:手动赋值
NSPoint point;
point.x = 10;
point.y = 10;
// 方式二:使用快捷函数
point = NSMakePoint(10, 18); // Mac常用
point = CGPointMake(29, 78); // iOS常用
第2步:坐标信息的字符串化
同样,使用NSStringFromPoint进行格式化输出:
NSString* str = NSStringFromPoint(point);
NSLog(@"point is %@", str);
3. NSSize 与 CGSize:定义宽高尺寸
该结构体专门用于记录对象的宽(width)和高(height),不包含位置信息。对应于前面的坐标概念,分别为Mac环境的NSSize和iOS环境的CGSize。
第1步:尺寸的构建逻辑
通过赋给两个CGFloat成员来设定大小:
NSSize size;
size.width = 100;
size.height = 12;
// 使用内置宏快速生成
size = NSMakeSize(12, 12);
size = CGSizeMake(11, 11); // iOS场景更常用
第2步:尺寸值的获取
借助工具函数NSStringFromSize将尺寸转为文字以便追踪:
NSString* str = NSStringFromSize(size);
NSLog(@"%@");
4. CGRect:结合位置的完整矩形
CGRect是前文提到的CGPoint与NSSize/CGSize的组合体,完整定义了一个矩形区域的空间属性。它是UIKit和AppKit中最常用的绘图结构。
第1步:CGRect的内部构成
它包含原点origin(类型为CGPoint)和大小size(类型为NSSize):
struct CGRect {
CGPoint origin; // 位置坐标
CGSize size; // 尺寸大小
};
第2步:矩形区域的快速创建
手动修改内部属性较为繁琐,推荐直接使用四参数工厂函数CGRectMake或NSMakeRect:
// 完整参数:x, y, width, height
rect = CGRectMake(12, 12, 12, 12);
rect = NSMakeRect(11, 11, 11, 11); // Mac兼容写法
第3步:矩形的调试输出
使用对应的转换函数,查看完整的矩形配置:
NSString* str5 = NSStringFromRect(rect);
NSLog(@"rect is %@", str5);
总结
在Objective-C开发中,熟练掌握这些基础结构体的区别至关重要。需要表达数据索引范围时选用NSRange;确定绝对定位时选用NSPoint/CGPoint;记录独立的大小时选用NSSize/CGSize;而在视图层级管理中,几乎都需要组合使用的CGRect。同时,利用Xcode提供的NSStringFrom...系列函数配合NSLog,可以大幅降低结构体状态排查的难度。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













