一、 结构体
NSRange (location length)两个属性
NSPoint \ CGPoint 一般用后者(跨平台),下面几个也一样用后者
NSSize \ CGSize
NSRect \ CGRect
1.NSRage 范围
#import
int main(int argc, const char * argv[])
{
// struct Date {
// int year;
// int month;
// int day;
// };
// struct Date d = {2011, 1, 9};
//
// @"i love oc" ;//求love 的范围
//
// NSRange r1 = {2, 3}; //可读性不好,一般不用
// NSRange r2 = {.location = 2, .length =4}; //太冗余了,也不用
// NSRange r3 = NSMakeRange(2, 4); // 掌握
NSString *str = @"i love you";
//查找某个字符串在str中的范围
//如果找不到 ,length=0, location=NSNotFound==-1(以%d方式打印出来是-1,如果以%ld打印出来是很大的一个数)
NSRange range = [str rangeOfString:@"i"];
NSLog(@"loc=%ld, length = %ld", range.location, range.length);
return 0;
}
3. CGSize 可以代表一块尺寸区域
4.CGRect (CGPoint CGSize)
CGPoint p1 =NSMakePoint(10,20);
CGPoint p2 = CGPointMake(10,20);
CGSize s1 = CGSizeMake(100,50);
CGRect r1 =CGRectMake(30,40,100,50);
还可以如下:
CGRect r2 = {{10,20},{100,50}};
CGRect r3 = {p1,s1};
CGRect r4 = {CGPointZero, CGSizeMake(100, 50)};
//将结构体转换成字符串
NSString *str =NSStringFromPoint(p1);
同理还有NSString *str2 =NSStringFromSize(s1);
NSLog(@"%@",str);
5.比较两个点是否相同(x,y)
//比较两个点是否相同
BOOL b = CGPointEqualToPoint(CGPointMake(10,20),CGPointMake(10,20));
//比较范围是否相同
BOOL b2 = CGSizeEqualToSize(CGSizeMake(100,50),CGSizeMake(100,50));
//判断一个点是否在范围内
BOOL b3 =CGRectContainsPoint(CGRectMake(50,40,100,50),CGPointMake(130,70));
二、字符串
//NSString : 不可变字符串
//NSMutableString: 可变字符串
//mutable就是可变的意思
NSString *s1 = @"jack";
NSString *s3 = [[NSStringalloc]initWithFormat:@"age is %d",10 ];
//c字符串--》OC字符串,注意后面没有@
NSString *s4 = [[NSStringalloc]initWithUTF8String:"jack"];
//OC 字符串 -->c 字符串const char *s5 = [s4UTF8String];
//读取文件
NSString *s5 = [[NSStringalloc]initWithContentsOfFile:@"/Users/apple/Desktop/abc/aaa.c"encoding:NSUTF8StringEncodingerror:nil];
NSLog(@"%@",s5);
用url是万能的
// URL:资源路径
// 协议头:路径
// file://
// ftp://
// http://weibo.com.a.png
NSURL *url = [[NSURLalloc]initWithString:@"file:///Users/apple/Desktop/abc/aaa.c"];//需要协议头
//下面这种不需要协议头
NSURL *s9 = [[NSURL alloc] initFileURLWithPath:@"/Users/apple/Desktop/abc/aaa.c"];
NSString *s7 = [[NSStringalloc]initWithContentsOfURL:urlencoding:NSUTF8StringEncodingerror:nil];
//一般都有对应的类方法,而且一般用类方法来调用。
[NSURL URLWithString:<#(NSString *)#>] //相当对应上面的方法
//[NSString stringWithFormat:@"age is %d",age]
[NSString stringWithContentsOfFile:<#(NSString *)#> encoding:<#(NSStringEncoding)#> error:<#(NSError *__autoreleasing *)#>
//写文件
注意,需要添加CoreGraphics.framework
[@"jack jack"writeToFile:@"/Users/apple/Desktop/abc/a1.c"atomically:YESencoding:NSUTF8StringEncodingerror:nil];
//atomicall:yes 安全,如果写入失败,不会创建。
//可变字符串
NSMutableString *s1 = [NSMutableStringstringWithFormat:@"age is 10"];
//拼接字符串
[s1 appendString:@"11 12"];
//获取is的范围并且删除,不论字符串位置在哪
NSRange range = [s1 rangeOfString:@"is"];
[s1 deleteCharactersInRange:range];
//而不可变字符串只可以拼接后赋值给新的字符串
NSString *s2 = [NSString stringWithFormat:@"age is 10"];
NSString *s3 = [s2stringByAppendingString:s2];
三、集合类
1.NSArray 对象数组(不可变)有序;
// OC数组只能存放OC对象、不能存放非对象类型,比如int、struct、enum等
//这个array永远是空数组
//NSArray *array = [NSArray array];
1>array简单使用
NSArray *array2 = [NSArrayarrayWithObject:@"jack"];
//nil结束村志
NSArray *array3 = [NSArray arrayWithObjects:@"jack", @"rose", nil];
//NSArray的元素个数
NSLog(@"%ld", array2.count);
//NSArray中元素的访问
NSLog(@"%@",[array3 objectAtIndex:1]);
//由于编译器特性,array3[1]等价于上边
NSLog(@"%@",array3[0]);
Person *p = [[Personalloc]init];
2>array遍历数组
NSArray *array = @[p, @"rose", @"jack"];
//第一种遍历数组
for (int i =0; i
NSLog(@"%@",array[i]);
}
//第二种
for (id objin array) {
NSUInteger i =[array indexOfObject:obj];
NSLog(@"%ld-%@", i, obj);
}
//第三种方式用block
[array enumerateObjectsUsingBlock:
^(id obj,NSUInteger idx,BOOL *stop) {
NSLog(@"%ld - %@", idx, obj);
if (idx ==0)
{
//停止遍历
*stop = YES;
}
}];
//创建可变数组并添加元素
NSMutableArray *array = [NSMutableArrayarrayWithObjects:@"rose",@"rose",@"jim",nil];
// NSMutableArray *array = [NSMutableArray array];
//添加元素
[array addObject:[[Person alloc] init]];
[array addObject:@"jack"];
//错误写法,不能放空值
//[array addObject:nil];
//删除元素
//[array removeObject:@"jim"];
//删除全部
//[array removeAllObjects];
//删除指定位置元素
//[array removeObjectAtIndex:0];
NSLog(@"%@", array);;
NSLog(@"%ld", array.count);
1.2.1>/*
NSMutableArray *array = @[@"jack",@"jim"];
[array addObject:@"rose"];
*/
NSSet和NSArray的对比
1> 共同点
* 都是集合,都能存放多个OC对象
* 只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、char、float等,结构体,枚举)
* 本身都不可变,都有一个可变的子类
2> 不同点
* NSArray有顺序,NSSet没有顺序
*/
// 永远是空的Set
NSSet *s = [NSSet set];
NSSet *s2 = [NSSet setWithObjects:@"jack", @"rose",@"jim", nil];
// 随机返回个变量
NSSet *str = [s2 anyObject];
NSLog(@"%@", str);
//NSLog(@"%ld", s2.count);
// 可变Set
NSMutableSet *s3 = [NSMutableSetset];
//添加元素
[s3 addObject:@"jack"];
//删除元素(只能删除全部或者某个元素)
// [s3 removeObject:<#(id)#>];
//第一种方法,只能创建一个
NSDictionary *dict1 = [NSDictionarydictionaryWithObject:@"jack"forKey:@"name"];
//第二种方法创建多个
NSArray *key =@[@"name",@"age",@"address"];
NSArray *objects = @[@"jack",@"23",@"北京"];
NSDictionary *dict2 = [NSDictionary dictionaryWithObjects:objects forKeys:key];
// 第三种
NSDictionary *dict3 = [NSDictionarydictionaryWithObjectsAndKeys:
@"jack",@"name",
@"北京",@"address",
@"3232342",@"qq",nil];
//第四种,编译器特性, (注:这种方式仅能给不可变字典使用,返回值类型为NSDictionary)
NSDictionary *dict4 =@{@"name" :@"jack",@"address" :@"北京",@"qq" :@"4324234"};
// 能过某个key找到对应的值
id obj = [dict4 objectForKey:@"qq"];
//编译器特性等价于上面的
id obj2 = dict4[@"qq"];
NSLog(@"%@", obj2);
NSMutableDictionary *dict = [NSMutableDictionarydictionary];
//添加键值对
[dict setObject:@"jack" forKey:@"name"];
[dict setObject:@"北京"forKey:@"address"];
//添加一样的key,则会覆盖
[dict setObject:@"rose" forKey:@"name"];
//移除键值对
//[dict removeObjectForKey:<#(id)#>];
NSString *str = dict[@"name"];
NSLog(@"%@", str);
3.遍历字典
// 字典不允许有相同的key,但允许有相同的value(Object)
// 字典的无序的
NSDictionary *dict = @{
@"address" : @"北京",
@"name" : @"jack",
@"name2" : @"jack",
@"name3" : @"jack",
@"qq" : @"7657567765"};
// NSArray *keys = [dict allKeys];
//
// for (int i = 0; i
//想用有序字典,场景,联系人,可用如下方式,用数组存放字典
NSArray *persons = @[
@{@"name" : @"jack", @"qq" : @"353432", @"books" : @[@"5分钟学会ios", @"5分钟突破android编程"]},
@{@"name" : @"rose", @"qq" : @"9890897897"},
@{@"name" : @"jim", @"qq" : @"89079879"}
];
// 特殊写法
// 1.先取出字典中qq这个key对应的数据
NSLog(@"%@", persons[2][@"qq"]);
NSLog(@"%@", persons[0][@"books"][1]);
NSLog(@"%@", persons[1]);
1.NSNumber 把基本数据类型包装成对象
NSNumber *num = [NSNumbernumberWithInt:20];
NSDictionary *dict = @{@"name":@"jack",
@"age" : num
};
NSNumber *num2 = dict[@"age"];
int a = [num2 intValue];
NSNumber *n = [NSNumbernumberWithDouble:10.5];
int d = [n doubleValue];
int a = 20;
//将整型转成字符串
NSString *str = [NSString stringWithFormat:@"%d", a];
//[str intValue];等价于下面
//[@"20" intValue];
//又一个编译器特性
//@20;
//相当于
[NSNumbernumberWithInt:20];
//还有
@10.5;// NSNumber对象
@YES;// NSNumber对象
@'A';// NSNumber对象
@"A";// NSString对象
int age =20;
@(age);// NSNumber对象
//NSNumber 之所以能包装基本数据类型,是因为继承了NSValue,
NSValue 可以把结构体包装成对象
//下面是一个结构体
CGPoint p = CGPointMake(10,10);
//把结构体包装成oc对象
NSValue *value = [NSValue valueWithPoint:p];
//然后就可以把value放进数组里了
NSArray *array = @[value];
//再转回结构体
cgpoint p2 = [value pointerValue];
NSDate *date = [NSDatedate];
//打印出来是0时区的时间 (北京是东8区需要加上8小时)
NSLog(@"%@", date);
NSDate *date2 = [NSDatedateWithTimeInterval:200sinceDate:date];
NSTimeInterval seconds = [date2 timeIntervalSince1970];
NSLog(@"%@", date2);
NSDate *date = [NSDatedate];
//日期格式化类
NSDateFormatter *formatter = [[NSDateFormatteralloc]init];
//y年M月 d日
//m分 s秒 H(24)时 h(12)时
formatter.dateFormat =@"yyyy-MM-dd HH:mm:ss";
@"2011-09-10 17:56:45";
NSString *str = [formatter stringFromDate:date];
//打印出来的是当前的时间
NSLog(@"%@", str);
NSString *time =@"2013/09/10 18:56";
NSDateFormatter *formater = [[NSDateFormatteralloc]init];
formater.dateFormat =@"yyyy/MM/dd HH:mm";
NSDate *date = [formater dateFromString:time];
NSLog(@"%@", date);
//
// main.m
// Foundation15-NSObject
//
// Created by mj on 13-4-7.
// Copyright (c) 2013年 itcast. All rights reserved.
//
#import
#import "Student.h"
#import "Person.h"
#pragma mark NSObject常用方法
void objUse() {
Student *stu = [[[Student alloc] init] autorelease];
// isKindOfClass判断对象是否属于某个类 或者 子类
if ( [stu isKindOfClass:[Person class]] ) {
// NSLog(@"stu属于Person或者继承自Person");
}
// isMemberOfClass判断对象是否属于某个类(不包括子类)
BOOL result = [stu isMemberOfClass:[Student class]];
// NSLog(@"%i", result);
// 还有以前的两种如下
// conformsToProtocol:判断是否遵守了某个协议
if ([stu conformsToProtocol:@protocol(Study)]) {
NSLog(@"Student遵守了Study这个协议");
}
// respondsToSelector:判断是否实现了某个方法
if ( ![stu respondsToSelector:@selector(test)] ) {
NSLog(@"Student没有实现test这个方法");
}
// 直接调用
// [stu test];
// 间接调用
[stu performSelector:@selector(test)];
// [stu performSelector:@selector(test2:) withObject:@"abc"];
// 延迟2秒后调用test2:方法
[stu performSelector:@selector(test2:) withObject:@"abc" afterDelay:2];
}
void reflect() {
// 类的反射
NSString *str = @"Person";
Class class = NSClassFromString(str);
Person *person = [[class alloc] init];
NSLog(@"%@", person);
// Class变成字符串
NSString *name = NSStringFromClass([Person class]);
// 方法的反射
NSString *method = @"test";
SEL selector = NSSelectorFromString(method);
[person performSelector:selector];
// 将SEL转换为字符串
NSString *selectorName = NSStringFromSelector(selector);
[person release];
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
reflect();
}
return 0;
}