在讲述框架之前,我们可以想象一个问题,那就是为什么我们每次创建文件的时候,都去选择Cocoa Class或者Cocoa Touch Class 尼?
Cocoa 是什么?
ocoa不是一种编程语言(它可以运行多种编程语言),它也不是一个开发工具(通过命令行我们仍然可以开发Cocoa程序),它是创建Mac OS X和IOS程序的原生面向对象API,为这两者应用提供了编程环境。
我们通常称为“Cocoa框架”,事实上Cocoa本身是一个框架的集合,它包含了众多子框架,其中最重要的要数“Foundation”和“UIKit”。前者是框架的基础,和界面无关,其中包含了大量常用的API;后者是基础的UI类库,以后我们在IOS开发中会经常用到。这两个框架在系统中的位置如下图:
其实所有的Mac OS X和IOS程序都是由大量的对象构成,而这些对象的根对象都是NSObject,NSObject就处在Foundation框架之中
通常我们会将他们分为几类:
值对象
集合
操作系统服务:文件系统、URL、进程通讯
通知
归档和序列化
表达式和条件判断
Objective-C语言服务
-
常用结构体
在C语言阶段我们已经学过结构了,而为了简化我们的开发,Foundation框架为我们预先创建了很多,在开发中常用的结构体。这样的话,我们就不必要每次创建项目的时候都去创建同样的代码。
1.NSSize NSPoint NSRange NSRect
NSSize NSPoint NSRange NSRect 四种结构体,一般用于图形方面
//图形的宽高
NSSize nssize =NSMakeSize(3, 5);
NSLog(@"width:%lf,height:%lf",nssize.width,nssize.height);
//图形的坐标
NSPoint nspoint = NSMakePoint(3, 5);
NSLog(@"x:%lf,y:%lf",nspoint.x,nspoint.y);
// 范围
NSRange nsrange = NSMakeRange(3, 5);
NSLog(@"location:%ld,length:%ld",nsrange.location,nsrange.length);
//图形的坐标和宽高
NSRect nsrect = NSMakeRect(5, 5, 100, 100);
NSLog(@"x:%lf,y:%lf,width:%lf,height:%lf",nsrect.origin.x,nsrect.origin.y,nsrect.size.width,nsrect.size.height);
实例讲解:
题目:
创建一个矩形类,创建一个自定义构造方法initWithFrame:(NSRect)rect
根据下图,打印出图形
0 1 2 3 4 5 6 7 8 9
1
2
3 * * * *
4 * * * *
5 * * * *
7 * * * *
8
9
#import <Foundation/Foundation.h> @interface Rectangle : NSObject #pragma mark 矩形的方位和宽高 @property (nonatomic,readwrite,assign)CGRect rect; /** * 初始化布局 * * @param newRect 新的布局 * * @return */ - (id)initWithFrame:(CGRect)newRect; /** * 显示图形 */ - (void)display; @end #import "Rectangle.h" @implementation Rectangle - (id)initWithFrame:(CGRect)newRect { if(self = [super init]) { [self setRect:newRect]; 等同于 self.rect = newRect } return self; } - (void)display { for (int i = 0; i<=9; i++) { for (int j = 0; j<=9;j++) { if(i==0) printf("%d",j); else if(j==0&&i!=0) printf("%d",i); else if(j>=self.rect.origin.x&& i>=self.rect.origin.y&& j<self.rect.origin.x+self.rect.size.width&& i<self.rect.origin.y+self.rect.size.height) { printf("*"); }else printf(" "); } printf("\n"); } } @end //main函数测试 int main(int argc, const char * argv[]) { @autoreleasepool { Rectangle *rect = [[Rectangle alloc]initWithFrame:(CGRect){4,6,4,4}]; [rect display]; } return 0; }
运行结果:
2016-04-11 12:55:01.481 oc_single[1931:91316] 调用
0123456789
1
2
3
4
5
6 ****
7 ****
8 ****
9 ****
Program ended with exit code: 0
该类结构主要适用于UI控件的方位和大小调控。
通过上面实例,我们再增加一个系列, 创建一个矩形,创建自定义构造方法设定它的布局,然后每隔2秒,让它移动向下移动一厘米。
将main函数的代码替换掉:
#import "Rectangle.h" int main(int argc, const char * argv[]) { @autoreleasepool { int y = 0; Rectangle *rect = [[Rectangle alloc]initWithFrame:(CGRect){0,y,4,4}]; NSDate *startTime = [NSDate date]; 开始时间 NSTimeZone *timeZone = [NSTimeZone systemTimeZone]; NSInteger interval = [timeZone secondsFromGMTForDate:startTime]; 开始时间设置 startTime = [startTime dateByAddingTimeInterval:interval]; NSLog(@"%@",startTime); NSDate* endTime = [NSDate date]; while (1) { 获取结束时间 endTime = [NSDate date]; endTime = [endTime dateByAddingTimeInterval:interval]; 判断结束时间和开始时间的时间差 int ret = (int)[endTime timeIntervalSinceDate:startTime]; if(ret==2) { 获取图形的布局 CGRect tempRect = [rect rect]; 让这个布局的y坐标向下移动 tempRect.origin.y++; tempRect.origin.x++; 重新设置图形的布局 [rect setRect:tempRect]; 显示这个布局 [rect display]; 让开始时间变成结束 startTime = endTime; } } } return 0; }
来源:oschina
链接:https://my.oschina.net/u/2914921/blog/749025