Foundation 框架的学习

一、Foundation 常用结构体

  1、NSRange(location,length)  

 typedef struct _NSRange {
NSUInteger location; // unsigned long
NSUInteger length; // unsigned long
} NSRange;

  使用注意     

     NSRange r1 = {,}; // 结构体格式的初始化

     NSRange r2 = {,};

     // NSRange 的函数,用来初始化NSRange

     NSRange r3 = NSMakeRange(, ); // 推荐这种方式初始化
     NSString *str = @"i love oc";
// rangeOfString 查找某个字符串在字符串中得范围
NSRange r4 = [str rangeOfString:@"love"]; // 2 ,4
NSLog(@"location:%ld,length:%ld",r4.location,r4.length);

  如果找不到字符串,length ==  0,location == NSNotFound == -1

  2、NSPoint\CGPoint

 struct CGPoint {
CGFloat x; // double类型
CGFloat y; // double类型
};
typedef struct CGPoint CGPoint;
     CGPoint p1 = NSMakePoint(, );
NSPoint p2 = CGPointMake(, );//常用这个

3、NSSzie\CGSize

 struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
  // 初始化
CGSize s1 = CGSizeMake(, );
NSSize s2 = NSMakeSize(, );
NSSize s3 = CGSizeMake(, );

 4、NSRect\CGRect

struct CGRect {
CGPoint origin; // 初始点
CGSize size; // 宽度和高度
};
typedef struct CGRect CGRect;
   // 初始化
CGRect r1 = CGRectMake(, , , );
NSRect r2 = NSMakeRect(, , , );

  5、常用函数

  输出这些结构体,只需要把这些结构退转换成字符串输出即可,系统提供的有函数

     // 输出这些结构体,只需要把这些结构退转换成字符串
NSString *strp = NSStringFromPoint(p1); // point
NSLog(@"%@",strp); strp = NSStringFromRange(r4); // range
NSLog(@"%@",strp); strp = NSStringFromSize(s1); // size
NSLog(@"%@",strp); strp = NSStringFromRect(r1); // rect
NSLog(@"%@",strp);

  原点输出,系统自带的

  // 原点 {0 , 0}
CGPoint p3 = CGPointZero; // == CMakePoint(0,0)

  比较

     // 比较两个点是否一样
BOOL b = CGPointEqualToPoint(p1, p2);
b = CGSizeEqualToSize(s1, s2);
b = CGRectEqualToRect(r1, r2); // 需要添加CoreGraphics框架
// 判断点是否在矩形块内
b = CGRectContainsPoint(CGRectMake(, , , ), CGPointMake(, )); NSLog(@"%d",b);

二、字符串

NSString  不可变字符串,不能修改

NSMutableString 可变字符串,可以增删字符。继承自NSString

  1、字符串的创建

     // 字符串的创建
NSString *s1 = @"hello";
NSString *s2 =[[NSString alloc] initWithFormat:@"age is %d",];
NSString *s3 = [[NSString alloc] initWithUTF8String:"world"]; //c语言字符串转换OC字符串
const char *cs = [s3 UTF8String]; // oc字符串转换C字符串 // 读取文件内容到字符串
// NSUTF8StringEncoding 用到中文就可以用这样的编码
NSString *s4 = [[NSString alloc] initWithContentsOfFile:@"/Users/song/Desktop/1.m" encoding:NSUTF8StringEncoding error:nil]; NSLog(@"s4 = %@",s4); // url 资源路径
// 协议头://路径
// http://www.qq.com//a.png
// file:// 本地
// ftp://
//
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/song/Desktop/1.m"];
NSURL *url1 = [NSURL fileURLWithPath:@"file:///Users/song/Desktop/1.m"];
NSString *s5 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSLog(@"s5 = %@",s5); //
url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
NSString *s6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSLog(@"s6 = %@",s6); // 相关的各种类方法,灵活运用,以类开头
[NSString stringWithFormat:@""];
[NSString stringWithContentsOfFile:@"file:///Users/song/Desktop/1.m" encoding:NSUTF8StringEncoding error:nil];
[NSURL URLWithString:@"file:///Users/song/Desktop/1.m"];
[NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

  2、字符串的导出

     // 字符串导出
[@"hello\n world" writeToFile:@"/Users/song/Desktop/1.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
[@"haha haha" writeToURL:@"/Users/song/Desktop/2.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];

   3、可变与不可变的区别

     NSString *s1 = [NSString stringWithFormat:@"age is %d",]; // 不可变字符串
NSMutableString *s2 = [NSMutableString stringWithFormat:@"age is %d",]; // 可变字符串 NSLog(@"s1 = %@",s1);
NSLog(@"s2 = %@",s2); [s2 appendFormat:@" 11 23"]; // 增加字符 NSLog(@"_______________"); NSRange r1 = [s2 rangeOfString:@"is"]; // 查找字符串“is”的range
[s2 deleteCharactersInRange:r1];// 删除字符 NSLog(@"s1 = %@",s1);
NSLog(@"s2 = %@",s2); // 重新创建一个字符串 返回一个新的字符串
NSString *s3 = [s1 stringByAppendingString:@""];
NSLog(@"s3 = %@",s3);

三、数组类

  1、不可变数组 NSArrray

  创建数组  

     // nil 是数组结束标标记
NSArray *array1 = [NSArray arrayWithObjects:@"hello", nil];
NSArray *array2 = [NSArray arrayWithObjects:@"hello",@"world", nil]; NSLog(@"%ld",array2.count); // 数组元素个数
NSLog(@"%@",[array2 objectAtIndex:]); // 获取数组元素 NSLog(@"%@",array2[]); // 获取数组元素 Person *p = [[Person alloc] init];
// 快速创建一个数组
NSArray *array3 = @[p,@"hello",@"world!",@"la la la !"];

  遍历数组

   // 遍历1
for(int i = ; i < array3.count ; i ++ )
{
NSLog(@"%d--%@",i,array3[i]);
}
// 遍历2
for(id obj in array3)
{
NSUInteger i = [array3 indexOfObject:obj];
NSLog(@"%ld___%@",i,obj);
}
// 遍历3 block
[array3 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
NSLog(@"%ld=>%@",idx,obj);
if(idx == )
{
// 停止遍历
*stop = YES;
}
}];

  2、可变数组  NSMutableArray

 // 可变数组的使用
void NSMutableArrayTest()
{
NSMutableArray *array = [NSMutableArray array];
[array addObject:[[Person alloc] init]]; // 添加对象
[array addObject:@"hello"]; // 添加元素
[array addObject:@"world"];
[array removeObject:@"hello"]; // 删除元素
NSLog(@"%ld",array.count); [array removeObjectAtIndex:]; // 使用索引删除指定元素
NSLog(@"%@",array); // 错误写写法
// @[] 只用来创建不可变数组NSArray
// NSMutableArray *array = @[@"hello",@"world"]; // [array addObject:@"hello"];
}

四、练习:读取文件行数

主要练习以下三个类型的使用
NSString
NSArray
NSFileManage
 //  main.m
// 11_计算代码行数
//
// Created by Christian on 15/4/19.
// Copyright (c) 2015年 Christ. All rights reserved.
// #import <Foundation/Foundation.h> /*
NSString
NSArray
NSFileManage */ /*
函数名: codeLineCount
参数: 文件路径 path,文件夹或者文件
返回值: 行数
*/
NSUInteger codeLineCount(NSString *path); int main()
{
NSString *path = @"/Users/song/Desktop/OC/";
NSUInteger count = codeLineCount(path);
NSLog(@"%ld",count);
return ;
} NSUInteger codeLineCount(NSString *path)
{
// 1、获得文件管理者,单例模式,只有一个对象
NSFileManager *mgr = [NSFileManager defaultManager];
// 2、判断是文件夹还是文件
BOOL dir = NO; // 标记是否是文件夹
BOOL exit = [mgr fileExistsAtPath:path isDirectory:&dir];
// 3、路径不存在,直接返回0
if(!exit)
{
return ;
}
// 4、路径存在
if(dir) // 是个文件夹
{
//NSLog(@"文件夹");
// 获取当前目录中得所有文件夹、文件
NSArray *array = [mgr contentsOfDirectoryAtPath:path error:nil];
// NSLog(@"%@",array);
int count = ; for(NSString *filename in array)
{
// 获取全路径
NSString *fullpath = [NSString stringWithFormat:@"%@/%@",path,filename ];
// NSLog(@"%@",fullpath);
count += codeLineCount(fullpath); // 递归调用
}
return count; }
else // 是个文件
{ // 5、判断文件的扩展名(忽略大小写)
NSString *extention = [[path pathExtension] lowercaseString]; // 扩展名转换成小写
// 不是.h/.c/.m
if( ![extention isEqualToString:@"h"]
&& ![extention isEqualToString:@"m"]
&& ![extention isEqualToString:@"c"] )
{
return ;
}
//NSLog(@"文件");
// 2、加载文件
NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; //NSLog(@"%@",content);
// 3、切割字符串
NSArray *array = [content componentsSeparatedByString:@"\n"]; // 以\n 分割整个字符串,返回数组保存每行的字符串 NSRange range = [path rangeOfString:@"/Users/song/Desktop/OC/"];
NSString *str = [path stringByReplacingCharactersInRange:range withString:@""]; NSLog(@"%@-%ld",str,array.count);
// 输出文件
/*
for (NSString *line in array)
{
NSLog(@"%@",line);
}*/
return array.count;
} return ; }

五、集合类

NSSet/NSMutableSet

  1、不可变集合

   // 不可变集合
NSSet *set1 = [NSSet set]; // 这样初始化后set不可改变,所以不这样初始化 NSSet *set2 = [NSSet setWithObject:@"hello"]; // 初始化单个元素
NSSet *set3 = [NSSet setWithObjects:@"hello",@"world",@"what",@"a",@"luck",@"day", nil]; // 初始化多个元素
NSSet *set4 = [NSSet setWithSet:set3]; // 以一个set初始化一个set NSString *str1 = [set4 anyObject]; // 获取一个随机元素 NSLog(@"%@",str1);

  2、可变集合

   // 不可变集合
NSMutableSet *mset1 = [NSMutableSet set]; // 定义并初始化一个set [mset1 addObject:@"hello"]; // 增加一个元素 //[mset1 removeObject:@"hello"]; // 删除一个元素
NSString *s = [mset1 anyObject];
NSLog(@"%@",s); 

  3、NSSet 和 NSArray 区别

NSSet 和 NSArray

1、共同点

都是集合,只能存放多个OC对象

只能存放OC对象,不能存放非OC对象,(基本数据类型:int 结构体、枚举等)

2、不同点

NSArray 有序,NASet无序

六、字典

  1、不可变NSDictionary

里面存储的东西都是键值对
  key ----> value
  索引 ----> 文字内容

     // 定义一个字典1
// NSDictionary *dict = [NSDictionary dictionaryWithObject:@"hello" forKey:@"name"]; // 定义一个字典2
NSArray *keys = @[@"name",@"address",@"number"];
NSArray *values = @[@"Song",@"BeiJing",@""];
NSDictionary *dict1 = [NSDictionary dictionaryWithObjects:values forKeys:keys]; id obj = [dict1 objectForKey:@"name"];
NSLog(@"%@",obj);
// 定义一个字典3,不建议这样写,难以理解
NSDictionary *dict2 = [NSDictionary dictionaryWithObjectsAndKeys:
@"wang",@"name",
@"henan",@"address", nil]; id obj1 = [dict2 objectForKey:@"name"];
NSLog(@"%@",obj1);
// 定义一个字典4,推荐这样写,这是xcode封装的功能
NSDictionary *dict3 = @{@"name":@"li",@"address":@"hubei"}; //id obj3 = [dict3 objectForKey:@"name"];
id obj3 = dict3[@"name"]; // xcode 功能,可以这样实现
NSLog(@"%@",obj3);

  2、可变字典

NSMutableDictionary

   // 可变键值对 字典
NSMutableDictionary *mdict1 = [NSMutableDictionary dictionary];
// 添加键值对
[mdict1 setObject:@"hello" forKey:@"First"];
[mdict1 setObject:@"world" forKey:@"Second"];
// 移除键值对
// [mdict1 removeObjectForKey:@"Second"]; NSLog(@"%@",mdict1); //输出键值对*/
/* 输出结果如下
{
First = hello;
Second = world;
} */

  3、字典遍历

   // 字典遍历
// 遍历方式1
NSDictionary *dict11 = @{@"name":@"zhou",@"address":@"henan",@"qq":@""}; NSArray *Arraykeys = [dict11 allKeys];
// NSLog(@"%@",Arraykeys);
for(int i = ; i < dict11.count ; i ++)
{
NSString *key = Arraykeys[i];
NSString *value = dict11[key];
NSLog(@"%@---%@",key,value);
}
/* 输出结果是:
2015-04-20 18:02:49.661 11_Foundation[787:35995] name---zhou
2015-04-20 18:02:49.662 11_Foundation[787:35995] address---henan
2015-04-20 18:02:49.662 11_Foundation[787:35995] qq---32434
*/
// 遍历方式2
[dict11 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop)
{
NSLog(@"%@---%@",key,obj);
}];

  4、其他用法

     // 其他用法,多重嵌套
NSArray *person = @[
@{ @"name":@"li",@"address":@[@"china",@"beijing",@"chaoyang"]},
@{ @"name":@"zhang",@"address":@"henan"},
@{ @"name":@"wang",@"address":@"tianjin"},
@{ @"name":@"song",@"address":@"beijing"}]; NSDictionary *dict = person[];
NSLog(@"%@",dict); // 先取出数组位置1的字典,然后再取出key为name的value
NSLog(@"%@",person[][@"name"]); // 先取出数组位置0的字典,然后再取出key为name的value,再取出数组位置为0的元素
NSLog(@"%@",person[][@"address"][]);

集合总结

     1、NSArray 和 NSMutableArray

        有序

        快速创建(不可变)@[@"",@""];

        快速访问,:数组名[i];

     2、NSSet 和 NSMutableSet

        无序

     3、NSDictionary 和 NSMutableDictionary

        无序

        快速创建(不可变)@{@"key":@"value"};

        快速访问元素:字典名[key];

七、NSNumber(数字(int\double\bool)等类型包装成OC对象)

  1、包装数字到OC对象 NSNumber继承自NSValue

     /*
NSNumber 包装数字到OC对象 */
// 将数字转换成OC对象
NSNumber *num = [NSNumber numberWithInt:];
NSDictionary *dict = @{
@"name":@"jack",
@"age":num
};
// 取出对象
NSNumber *num2 = dict[@"age"];
// 将OC对象转换成数字
int a = [num2 intValue];
NSLog(@"%d",a); // 字符串转换成数字
NSString *str = [NSString stringWithFormat:@"%d",];
int b = [str intValue];
NSLog(@"%d",b); @; // 将20转换成NSNumber对象
@20.6;
@YES;
@'f'; // NSNumber
@"A"; // NSString
int age = ;
@(age); // 将变量转换成NSNumber

  2、将任意类型包装成OC对象 NSValue

     // 结构体包装成value对象
CGPoint point = CGPointMake(, );
// 将结构体包装成Value对象
NSValue *va = [NSValue valueWithPoint:point]; // 将value对象转换成对应的结构体
CGPoint point1 = [va pointValue]; NSArray *array = @[va]; // 再将对象添加到数组中

八、日期格式化相关的类  NSDate/NSDateFormatter

   // 创建一个时间对象,默认是0时区的时间,格林威治时间
NSDate *date = [NSDate date];
NSLog(@"%@",date);
// 在date的基础上延后5s
NSDate *date2 = [NSDate dateWithTimeInterval: sinceDate:date];
NSLog(@"%@",date2); NSTimeInterval seconds = [date2 timeIntervalSince1970]; // 1970年开始到现在的秒数
NSLog(@"%f",seconds); // 日期格式化类
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// y年 M月 d日
// h(12)时 H(24)时 m分 s秒
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; // 设置时间显示格式
NSString *str = [formatter stringFromDate:date]; // 时间转字符串 NSLog(@"%@",str); // 字符串转换成时间
NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init]; NSString *time = @"1990/02/03 19:34";
formatter2.dateFormat = @"yyyy/MM/dd HH:mm"; // 设置格式 NSDate *da = [formatter2 dateFromString:time]; //转换
NSLog(@"%@",da);

终于这些基础知识看完了,可以进行下一步了。

2015-04-20 今日如此,明日依旧。

IOS开发学习笔记016-Foundation框架的更多相关文章

  1. ios开发学习笔记040-autolayout 第三方框架Masonry

    不管是是界面创建约束还是代码创建约束,苹果官方提供的方式都比较繁琐.所以出现了第三方框架. Masonry 在github地址如下: https://github.com/SnapKit/Masonr ...

  2. iOS开发学习笔记

    1 常用的第三方工具 1.1 iPhone Simulator 测试程序需要模拟器iPhone Simulator 1.2 设计界面需要Interface Builder,Interface Buil ...

  3. iOS开发系列—Objective-C之Foundation框架

    概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NSObject,那么这个对象到底 ...

  4. ios开发学习笔记(1)

    objective-c基础总结 第一二章 1.application:didiFinishLauchingWithOptions:程序启动后立即执行 2.启动界面代码格式:self.window = ...

  5. iOS开发学习笔记:基础篇

    iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境 ...

  6. IOS开发学习笔记009-OC基本知识

    开始学习OC,时间不等人啊,要抓紧了. OC基本知识 新建一个以.m结尾的文件,这既是oc的程序文件.在oc程序中完全兼容C语言.编译好链接类似. oc包含头文件是使用#import <> ...

  7. ios开发学习笔记(这里一定有你想要的东西,全部免费)

    1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [ ...

  8. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:SSH框架(Struts2+Spring+Hibernate)搭建整合详细步骤

    在实际项目的开发中,为了充分利用各个框架的优点,通常都会把 Spring 与其他框架整合在一起使用. 整合就是将不同的框架放在一个项目中,共同使用它们的技术,发挥它们的优点,并形成互补.一般而言,在进 ...

  9. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring框架的基本思想

    EJB的学习成本很高,开发效率却不高,需要编写很多重复的代码,这些问题阻止了EJB的继续发展.就在EJB技术止步不前的时候,Spring框架在合适的时机出现了,Spring框架和EJB不同,Sprin ...

随机推荐

  1. mybatis-动态sql1

    在多条件查询的情况下必须用到动态sql 沿用之前的项目 1.在dao中添加多添件查询方法 package com.java1234.mappers; import java.util.List;imp ...

  2. HDU 4745 Two Rabbits (区间DP)

    题意: 两只兔子,在一个由n块石头围成的环上跳跃,每块石头有一个权值ai.开始时两兔站在同一石头上(也算跳1次),一只从左往右跳,一只从右往左跳,两只同时跳,而每跳一次,两只兔子所站的石头的权值都要相 ...

  3. windows xp professional 序列号(密钥)及百度网盘下载地址

    HH7VV-6P3G9-82TWK-QKJJ3-MXR96 https://pan.baidu.com/share/link?uk=4247247642&shareid=500360

  4. python资料汇总

    http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html

  5. Euerka环境搭建

    机器环境 windows10,IntelliJ IDEA 配置host 单节点Eureka 一.pom文件 <?xml version="1.0" encoding=&quo ...

  6. pip 安装出现异常

    MacBookPro:~ mac$ pip install numpy Collecting numpy Downloading numpy-1.13.1-cp35-cp35m-macosx_10_6 ...

  7. javaweb基础(33)_jdbc的crud操作

    一.statement对象介绍 Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可. Statement对象的exe ...

  8. Python小脚本程序

    本文旨在搜集最简单最原子性的代码块,简单清晰容易阅读,然后由用户自己组合.Python代码排版请自行修改. 这里是索引目录: 1. 下载网站文件 2. 下载网站多个文件 1. 下载网站文件 impor ...

  9. 文档处理jQuery,实现添加删除复制

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 安装配置mysql图文步骤以及配置mysql的环境变量的步骤

    MySQL下载地址:http://dev.mysql.com/downloads/installer/ 我的数据库是5.5.21这个版本的.其实可以一直点击next,直到出现第14张图,从这里开始要注 ...