iOS:从前笔记,未整理版。太多了,先放着啊。。。。。。。,ios……

//还原成基本数据类型

floatvalue = [floatNumber floatValue];

intvalue2= [intNumber intValue];

NSLog(@”value is %.2f”,value);

NSLog(@”value2 is %d”,value2);

NSNumber *intNum =@80;//—-> NSNumber *intNumber = [[NSNumber
alloc] initWithInt:80];

NSNumber *floatNum =@3.14;// —->[NSNumber
numberWithFloat:3.14];

NSNumber *boolNum =@YES;// —> [NSNumber numberWithBool:YES];

NSNumber *charNum = @’a’;// —> [NSNumber numberWithChar:’a’];

NSNumber*number = @;

iOS:从前笔记,未整理版。太多了,先放着吗。。。。。。。,ios……

1、

-(void)timetick

{

    _d = 0;

    NSTimer *newtime =[NSTimer scheduledTimerWithTimeInterval:1
target:self selector:@selector(printfdate:) userInfo:@”byL”
repeats:YES];

}

 

-(void)printfdate:(NSTimer*)time1

{

    NSLog(@”%d,%@”,_d++,time1.userInfo);

}

 

[newtime invalidate];

 

[[NSRunLoop currentRunLoop]run];

 

 

 

 

//早先化观望

 [_phone addObserver:self forKeyPath:@”price”
options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
context:nil];

//阅览到变化决定

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary<NSString *,id> *)change context:(void
*)context

{

    NSNumber *num = [change objectForKey:@”new”];

    NSLog(@”%@”,num);

}

 

//发送音信

[[NSNotificationCenter
defaultCenter]postNotificationName:@”pricechange” object:self
userInfo:nil];

//接受音讯初阶化

[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(salephone) name:@”pricechange” object:nil];

//接受到音信做决定

-(void)salephone

 

 

 

//数组

 NSArray *DATA_A
[email protected][类,类,类,类,类];

//设置过滤条件

NSPredicate *newpre = [NSPredicate predicateWithFormat:@”age >
29″];

//过滤后保存的数组

NSArray *newarray = [DATA_A filteredArrayUsingPredicate:newpre];

 

@“name BEGINSWITH ‘x’ ”

@“name ENDSWITH ‘x’ ”

@“name CONTAINS ‘x’ ”

@“age > 29 || age < 20”

@“name like ‘?d*’ ”

 

 

2、

sql

====================================================================

创建:

 

开垦: 数据库指针、保存地址

sqlite3_open([path UTF8String], &new_sql)

————————————————————————————————————————

创立:
数据库指针、创制指令、错误指令

(

NSString *command = @”CREATE TABLE IF NOT EXISTS UserTable (username
TEXT primary key,password TEXT,age TEXT)”;

)

sqlite3_exec(new_sql, [command UTF8String], NULL, NULL, &new_error)

————————————————————————————————————————

闭馆: 数据库指针

sqlite3_close(new_sql);

 

 

====================================================================

插入:

 

打开:

————————————————————————————————————————

安顿指令:

(

    NSString *op = @”INSERT INTO UserTable(username,password,age)
VALUES (?,?,?)”;

)

妄想: 数据库指针、插入指令、句柄

sqlite3_prepare(new_sql, [op UTF8String], -1, &new_stmt, NULL);

绑定: 句柄、位置、数据

sqlite3_bind_text(new_stmt, 1, [name UTF8String], -1, NULL);

下一步: 句柄

sqlite3_step(new_stmt);

结束: 句柄

sqlite3_finalize(new_stmt);

————————————————————————————————————————

关闭:

 

====================================================================

删除:

 

打开:

————————————————————————————————————————

剔除指令:

(

    NSString *op = @”DELETE FROM userTable WHERE userName = ?”;

)

预备: 数据库指针、删除指令、句柄

sqlite3_prepare(new_sql, [op UTF8String], -1, &new_stmt, NULL);

绑定: 句柄、位置、数据

sqlite3_bind_text(new_stmt, 1, [name UTF8String], -1, NULL);

下一步: 句柄

sqlite3_step(new_stmt);

结束: 句柄

sqlite3_finalize(new_stmt);

————————————————————————————————————————

关闭:

 

====================================================================

选择:

 

打开:

————————————————————————————————————————

分选指令:

(

    (1)NSString *op = @”SELECT username,password,age From UserTable
where username = ?”;

    (2)NSString *op = @”SELECT username,password,age From UserTable”;

)

桑土计划: 数据库指针、选拔指令、句柄

sqlite3_prepare(new_sql, [op UTF8String], -1, &new_stmt, NULL);

绑定: 句柄、位置、数据

(1)sqlite3_bind_text(new_stmt, 1, [selet_name UTF8String], -1,
NULL);

下一步: 句柄

sqlite3_step(new_stmt);

遍历:

while (result == SQLITE_ROW)

{

char *c_name = (char
*)sqlite3_column_text(new_stmt, 0);

char *c_password = (char
*)sqlite3_column_text(new_stmt, 1);

char *c_age = (char
*)sqlite3_column_text(new_stmt, 2);

        

        NSString *s_name = [NSString stringWithCString:c_name
encoding:NSUTF8StringEncoding];

        NSString *s_password = [NSString
stringWithCString:c_password encoding:NSUTF8StringEncoding];

        NSString *s_age = [NSString stringWithCString:c_age
encoding:NSUTF8StringEncoding];

        

        NSLog(@”%@,%@,%@”,s_name,s_password,s_age);

        result = sqlite3_step(new_stmt);

        //NSLog(@”%d”,new_stmt);

}

结束: 句柄

sqlite3_finalize(new_stmt);

————————————————————————————————————————

关闭:

 

====================================================================

插入变体:

更新

@”UPDATE UserTable SET password = ? where username = ?”

 

选择(2)变体:

排序

@“SELECT * FROM userTable ORDER BY age ASC(DESC)”

 

 

3、

@”[email protected]”

@”[email protected]”

@”[email protected]”

@”[email protected]”

 

4、

int gNumb=0;

全局变量平日用小写g来唤醒。  

 

重写,父类有扬言,不必再声称

 

[p1 isKindOfClass:[Person class]];

[p1 isMemberOfClass:[Person class]];

[p1 respondsToSelector:@selector(test)];

 

 

可变数组 copy 赋值给不可变数组。

 

 

-(NSString *)description

{

    return [NSString stringWithFormat:@”%@,%lu”,_name,_price];

}

 

 

==========================================================================

 

//编码

NSData *new_data = [s_text dataUsingEncoding:NSUTF8StringEncoding];

 

//解码

NSString *new_string = [[NSString alloc]initWithData:new_data
encoding:NSUTF8StringEncoding];

 

==========================================================================

//沙盒路线

NSHomeDirectory()

 

 //工程目录

[NSBundle mainBundle]

==========================================================================

 

//弄个公文管理

NSFileManager *new_File = [NSFileManager defaultManager];

 

//创制文件夹   path要加进文件夹名,不要后缀

[new_File createDirectoryAtPath:path withIntermediateDirectories:YES
attributes:nil error:&new_error]

 

//成立文件   path在事先文件夹下追加“xxx.xxx”    data要编码

[new_File createFileAtPath:new_path contents:new_data
attributes:nil]

 

//读取文件的音讯 再次来到字典

[new_File attributesOfItemAtPath:new_path error:&new_error]

 

//读取单个字典的重大词

[new_dic objectForKey:@”NSFileSize”]

 

==========================================================================

 

//文件读取

NSData *newData = [fileManager contentsAtPath:filePath];

[[NSString alloc]initWithData:newData
encoding:NSUTF8StringEncoding];

or

[[NSString alloc]initWithContentsOfFile:new_path
encoding:NSUTF8StringEncoding error:&new_error];

 

//文件移动(剪切、重命名),要抬高文件名和后缀”xxx.xx”

[new_File moveItemAtPath:new_path toPath:ob_add error:&new_error]

 

//文件复制   也要小心有文件名和后缀“xxx.xx”

[new_File copyItemAtPath:new_path toPath:ob_add_2
error:&new_error]

 

//文件删除  
也要注意有文件名和后缀“xxx.xx”

先决断有无文件

[new_File fileExistsAtPath:ob_add_2]

删除

[new_File removeItemAtPath:ob_add_2 error:&new_error]

 

==========================================================================

 //写入

 

/设置为写入格局

NSFileHandle *new_handle = [NSFileHandle
fileHandleForWritingAtPath:path];

 

/先转码

NSString *new_string = @”hello,hello,hello,世界”;

NSData *new_data = [new_string
dataUsingEncoding:NSUTF8StringEncoding];

/再写入

[new_handle writeData:new_data];

 

//追加

/先找到最后的

[new_handle seekToEndOfFile];

/写入转码后的数据

[new_handle writeData:new_data_2];

 

//覆盖

/先找到偏移位

[new_handle seekToFileOffset:3];

/写入转码后的数额

[new_handle writeData:new_data_3];

    

//关闭操作

[new_handle closeFile];

 

 

 

 

//读取

/设置为读取形式

new_handle = [NSFileHandle fileHandleForReadingAtPath:path];

/读取全数data

NSData *read_data = [new_handle readDataToEndOfFile];

/转成字符串

NSString *read_string = [[NSString alloc]initWithData:read_data
encoding:NSUTF8StringEncoding];

 

 

/设置为读取方式,不然至极

new_handle = [NSFileHandle fileHandleForReadingAtPath:path];

/读取前多少个数据

read_data = [new_handle readDataOfLength:10];

/转成字符串

ead_string = [[NSString alloc]initWithData:read_data
encoding:NSUTF8StringEncoding];

 

//关闭操作

[new_handle closeFile];

 

5、

协议

@required

@optional

 

nonatomic

copy assign

 

==================================================

.h签协议

<NSCopying>

 

.m设置要复制的值

– (id)copyWithZone:(nullable NSZone *)zone

{

    NSLog(@”复制对象调用了!”);

    Person *person = [[self class] allocWithZone:zone];

    person.name = [_name mutableCopy];

    person.age = _age;

    person.bookArray = [_bookArray mutableCopy];

    return person;

}

 

调用

Person *person2 = [person1 copy]; 

 

==================================================

.h签协议

<NSCoding>

 

.m设置要复制的值

– (void)encodeWithCoder:(NSCoder *)aCoder

{

    [aCoder encodeObject:_name forKey:NAME];

    [aCoder encodeInteger:_age forKey:AGE];

    [aCoder encodeObject:_hobby forKey:HOBBY];

    

}

 

– (nullable instancetype)initWithCoder:(NSCoder *)aDecoder

{

    self = [super init];

    if (self)

    {

        self.name = [aDecoder decodeObjectForKey:NAME];

        self.age = [aDecoder decodeIntegerForKey:AGE];

        self.hobby = [aDecoder decodeObjectForKey:HOBBY];

    }

    return self;

}

 

调用

//地址

NSString *path = [NSHomeDirectory()
stringByAppendingPathComponent:@”Desktop/di8zhangzuoue.txt”];

//归档

[NSKeyedArchiver archiveRootObject:atext toFile:path]

//读取

[NSKeyedUnarchiver unarchiveObjectWithFile:path];

==================================================

单例 分享新闻

.m

 

static OneT *newone = nil;

 

+(instancetype)shalldata

{

    if (newone == nil)

    {

        newone = [[OneT alloc]init];

        newone.data_zone = [NSMutableArray array];

    }

    return newone;

}

 

调用:

OneT *one = [OneT shalldata];

OneT *two = [OneT shalldata];

==================================================

 

 

    NSArray *data = [NSArray arrayWithObjects:@”zhang3″,@”li4″, nil];

    

    NSString *path = [NSHomeDirectory()
stringByAppendingPathComponent:@”ceshi83.txt”];

    

    BOOL status = [NSKeyedArchiver archiveRootObject:data
toFile:path];

    

   
NSLog(@”%@”,[email protected]”成功”:@”失败”);

    

    NSArray *r_data = [NSKeyedUnarchiver
unarchiveObjectWithFile:path];

    

    NSLog(@”%@”,r_data);

 

 

 6、

instancetype:重回与初步化类同样的门类。

 

-(instancetype)initWith…

{

self=[super init];

if(self)

{

}

return self;

}

 

-(class_A *)initwithone:(int)a other:(int)b

{

self=[super init];

if(self)

{

[self seta:a b:b ] ;

}

return self;

}

 

 

 

+(instancetype)robotWithName:(NSString*)r_name andage:(int)r_age

{

#if 0

    return [[self alloc]initWithName:(NSString*)r_name
andage:(int)r_age];

#else

    

    Robot *new_R = [[Robot alloc]initWithName:r_name
andage:r_age];

    return new_R;

#endif

}

 

 

 

@private 私有:唯有类定义内部可访谈

@protected 爱慕:唯有类自己和子类的定义里可访谈

@public 公有:程序的别样地点都可访谈

 

/** xxx */

#progame MARK xxx

 

[self performSelector:@selector(delaylog:) withObject:@”3秒”
afterDelay:2];

[[NSRunLoop currentRunLoop]run];

 

7、

SET

 

//初始化

NSSet *set = [[NSSet
alloc]initWithObjects:@“_1”,@“_2”,@“_3”,@“_4”,@“_3”, nil];

 

//可变早先化

NSMutableSet *mSet = [NSMutableSet set];

 

//可变增加对象

[mSet addObject:numobject];

 

//建个数组

NSArray *array = [NSArray arrayWithObjects:@“_3”,@“_4”,@“_5”,
nil];

//取数组的目的初阶化

NSSet *newSet = [NSSet setWithArray:array];

//又把set的对象给数组,自动清除重复

NSArray *newArray = [newSet allObjects];

//打印

NSLog(@”%ld”,[newSet count]);

 

//大肆取! 但不保障自由!

NSLog(@”%@”,[set anyObject]);

 

//是不是等于

[set isEqualToSet:newSet]

 

//是或不是带有

[newSet isSubsetOfSet:set]

 

 

 

ENUM

 

//将set的值给枚举

NSEnumerator *enumtor = [set objectEnumerator];

 

//将枚举里的靶子一一打字与印刷

for (NSObject* obj in enumtor)

 {

NSLog(@”–>%@”,obj);

}

 

8、

日卯时间

 

//美利坚独资国的时刻

NSDate *date = [[NSDate alloc]init];

 

//时区

NSTimeZone *myZone = [NSTimeZone systemTimeZone];

 

 //算时差 加上时差

NSInteger interValTimer = [myZone secondsFromGMTForDate:date];

NSDate *localDate = [date dateByAddingTimeInterval:interValTimer];

NSLog(@”%@”,localDate);

 

 

//明天

NSDate *date2 = [NSDate dateWithTimeIntervalSinceNow:24*60*60];

 

//昨天

NSDate *date2 = [NSDate dateWithTimeIntervalSinceNow:-ADAY];

NSLog(@”date2 = %@”,date2);

 

//1970年

NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:0];

NSLog(@”%@”,date2);

 

//参照他事他说加以考察日期2002年

NSDate *date3 = [NSDate dateWithTimeIntervalSinceReferenceDate:0];

NSLog(@”%@”,date3);

 

 

 

//nsdate -> nsstring 类型转变

NSDate *date1 = [NSDate date];

 

1.

NSString *date1str = date1.description;
//U.S.A.的岁月

 

2

NSDateFormatter *dateFormat1 = [[NSDateFormatter alloc]init];

2.1

[dateFormat1
setDateFormat:@”yyyy年MM月dd日 EEEE HH mm ss zz”];

 

2.2

    [dateFormat1
setDateStyle:NSDateFormatterShortStyle];

   [dateFormat1
setTimeStyle:NSDateFormatterMediumStyle];

 

NSString *datestr2 = [dateFormat1 stringFromDate:date1];

NSLog(@”datestr2 = %@”,datestr2);

 

 

 

//获取具备的时候区的名字

NSArray *timeZoneNames =  [NSTimeZone knownTimeZoneNames];

//新建三个时区

NSTimeZone *newZone = [NSTimeZone timeZoneWithName:@”Pacific/Fiji”];

//新建三个光阴格式

NSDateFormatter *dateFormat2 = [[NSDateFormatter alloc]init];

//设置该时区

[dateFormat2 setTimeZone:newZone];

//设置时间格式

[dateFormat2 setDateFormat:@”yyyy年MM月dd日 EEEE HH:mm:ss zz”];

//打印

NSString *dateString =  [dateFormat2 stringFromDate:[NSDate date]];

NSLog(@”dateString = %@”,dateString);

 

//字符串转date

NSString *dateStr4 = @”2016年07月27日 星期三 20:16:10 GMT+12″;

NSDate *date4 = [dateFormat2 dateFromString:dateStr4];

NSLog(@”%@”,date4);

 

 

 

 

 

 

 

NSRange newrange = NSMakeRange(1,5);

NSValue *newvalue = [NSValue valueWithRange:newrange];

NSLog(@”%@”,newvalue);

NSArray *newarray = [NSArray arrayWithObjects:newvalue, nil];

NSLog(@”%@”,newarray);

    

NSRange newrange2 = [newvalue rangeValue];

NSLog(@”%lu,%lu”,newrange2.location,newrange2.length);

 

 

 

//封装自定义的结构体

struct MyPoint 

{

int x;

        int y;

};

struct MyPoint mypoint;

mypoint.x = 10;

mypoint.y = 100;

    

NSValue *val2 = [NSValue value:&mypoint withObjCType:@encode(struct
MyPoint)];

NSLog(@”%@”,val2);

    

struct MyPoint mypoint2;

[val2 getValue:&mypoint2];

NSLog(@”mypoint2.x = %d,mypoint2.y = %d”,mypoint2.x,mypoint2.y);

 

 9、

@interface class_A:NSObject

@end

 

@implementation class_A

@end

 

@property int x;

@synthesize x;

 

[MyA setNumb:5];
即使实例变量是小写,这一个set后也要大写

n=[MyA numb]; 

 

[A B]  等价 A.B

 

[self 该.m文件的诀要],找不到再去父类找

 

 

与文件.h.m同名

@interface class_A:NSObject

@end

 

@interface class_B:class_A

@ens

 

继承里,class_B里的不二等秘书技的能够用

[self A的方法]

[self A的变量]

 

内需某文件的一点方法,能够用

@class xxx.h

 

倘诺xxx.h的某个方法访谈不了,如init,依旧要

#import xxx.h

 

双重包括的,在那之中二个.h方可用@class xxx(不用写.h),对应.m要#import
xxx.h

 

 

同名方法优先选用class_B的方法

 

同名的法子,会活动判定[A set_value:(int)x]的类,如剖断出A

 

id x;

x=放肆变量、class类

 

@try

{

}

@catch

{

}

@finally

{

}

 

还有的@throw

 

10、

字符串:

字符串的创设

 

对象方法:

[[NSString alloc]init];

[[NSString
alloc]initWithString:string];

[[NSString
alloc]initWithFormat:@”%@”,string1];

 

类方法:

[NSString
stringWithString:string];

[NSString
stringWithFormat:@”%@”,string2];

 

字符串格式化拼接

 

[NSString
stringWithFormat:@”%@%@”,string3,string4];

 

字符串比较

 

[string3
isEqualToString:string4];

[string3
caseInsensitiveCompare:string4];

[string3 compare:string4]

 

字符串长度

 

[string length];

string.length;

 

字符串大小写变化

 

[string uppercaseString];

[string lowercaseString];

[string capitalizedString];

 

字符串追加

 

[string4
stringByAppendingString:string3];

 

字符串查找

 

[string rangeOfString:@”world”];

NSNotFound

 

[string hasPrefix:@“www”];

[string hasSuffix:@“com”];

 

字符串截取

 

[string substringFromIndex:2];

[string substringToIndex:5];

[string
substringWithRange:range];

 

字符串跟基本数据类型调换

 

[NSString
stringWithFormat:@”%d”,a];

[NSString
stringWithFormat:@”%f”,b];

[NSString
stringWithFormat:@”%c”,c];

 

[strnum1 intValue];

[strnum2 floatValue];

const char *cc = [strchar
UTF8String];

 

字符串取个要素

 

[newstring characterAtIndex:3]

 

字符串是还是不是含有

 

[mString
containsString:@”hello”];

 

 

 

可变字符串的创办

 

[[NSMutableString
alloc]initWithString:string];

[[NSMutableString
alloc]initWithFormat:@”%@”,string];

 

[NSMutableString
stringWithString:string];

[NSMutableString
stringWithFormat:@”%@”,string];

 

 

可变字符串的交替

 

  [mString
replaceCharactersInRange:NSMakeRange(2,2) withString:@”xxx”];

 

可变字符串的插入

 

[mString insertString:@”aaa”
atIndex:1];

 

可变字符串的删除

 

[mString
deleteCharactersInRange:NSMakeRange(1, 3)];

 

可变字符串的充实

 

[S_1 appendString:@”QAZ”];

[S_1 appendFormat:@”%@”,S_1];

 

 

11、

字典的创办

NSDictionary *dic = [[NSDictionary
alloc]init];

 

//dic = @{key:value,…};

    dic = @{

            @”name”:@”xiaoming”,

           
@”age”:@”18″,

           
@”sex”:@”男”,

            @”name1″:@”xiaoming”

            };

 

对象方法:

//dic2 = @{value:key,…};

NSDictionary *dic2 = [[NSDictionary
alloc]initWithObjectsAndKeys:@”xiaohong”,@”name”,@”20″,@”age”,@”男”,@”sex”,@”12″,@”20″,@”aaa”,@”bbb”,
nil];

NSDictionary *dic3 = [[NSDictionary
alloc]initWithDictionary:dic2];

 

 

类方法:

NSDictionary *dic4 = [NSDictionary
dictionaryWithDictionary:dic3];

 

字典的尺寸

 

字典依据key获取value

[dic objectForKey:@”age”]

dic[@”age”]

 

字典抽出全数的key

NSArray *keyArray = [dic
allKeys];

 

字典收取全数的value

   NSArray *valueArray = [dic
allValues];

 

 

 

 

可变字典的成立

NSMutableDictionary *mDic1 =
[NSMutableDictionary dictionary];

 

类方法:

NSMutableDictionary *mDic =
[[NSMutableDictionary
alloc]initWithObjectsAndKeys:@”xiaoming”,@”name”,@”19″,@”age”,@”男”,@”sex”,
nil];

 

可变字典添英镑素

[mDic setObject:@”80kg”
forKey:@”weight”];

 

可变字典删除成分

    [mDic
removeObjectForKey:@”age”];

[mDic
removeObjectsForKeys:array];

 

可变字典删除所有因素

[mDic removeAllObjects];

 

可变字典遍历

for (NSString *key in mDic) 

{

NSLog(@”%@”,mDic[key]);

    }

 

 

存储

NSString *path =
@”/Users/etcxm/test.plist”;

    [dic writeToFile:path
atomically:YES];

 

NSArray  *A_data_R = [NSArray
array];

A_data_R = [NSArray
arrayWithContentsOfFile:S_add];

 

 

12、

数组的成立

NSArray *array1 = [[NSArray
alloc]init];

    array1 =
@[@”here”,@”is”,@”etcxm”];

 

对象方法:

    NSArray *array6 = [[NSArray
alloc]initWithObjects:array1,array5, nil];

NSArray *array2 = [[NSArray
alloc]initWithObjects:@”here”,@”is”,@”china”, nil];

NSArray *array3 = [[NSArray
alloc]initWithArray:array1];

 

 

类方法:

NSArray *array4 = [NSArray
arrayWithObject:@”hello”];

NSArray *array5 = [NSArray
arrayWithObjects:@”here”,@”is”,@”china”, nil];

NSArray *array6 = [NSArray
arrayWithArray:array1];

 

数组取下标成分

array5[2];

[array5 objectAtIndex:2];

 

数组的长度

array5.count

[array5 count]

 

数组是还是不是含有某些元素

[array10
containsObject:@”hello”];

 

数组通过成分获得下标

[array10 indexOfObject:@”1123”];

NSNotFound

 

数组连接成字符串,字符串分割成数组

NSString *string = [array1
componentsJoinedByString:@” “];

NSArray *array2 = [string
componentsSeparatedByString:@”i”];

 

数组访问最终二个成分

[array1 lastObject];

[array1 firstObject];

 

数组遍历

for (NSString *str in array1) 

{

       
NSLog(@”->%@”,str);

    }

 

数组追日成分

NSArray *array3 = [array1
arrayByAddingObject:@”hello”];

NSArray *array4 = [array1
arrayByAddingObject:array3];

NSArray *array5 = [array1
arrayByAddingObjectsFromArray:array3];

 

 

 

 

可变数组的创办

NSMutableArray *mArray =
[[NSMutableArray alloc]initWithObjects:@”hello”,@”world”,@”china”,
nil];

 

 

 

可变数组添新币素

[mArray addObject:@”American”];

 

NSArray *array = [[NSArray
alloc]initWithObjects:@”hi”,@”hei”, nil];

[mArray
addObjectsFromArray:array];

 

可变数组删除成分

    [mArray removeAllObjects];

    [mArray3
removeObject:@”here”];

[mArray3 removeObjectAtIndex:3];

    [mArray3 removeLastObject];

    [mArray3
removeObjectsInArray:arraytest];

    [mArray3
removeObjectsAtIndexes:set1];

    [mArray3 removeObject:@”here”
inRange:NSMakeRange(0, 3)];

    [mArray3
removeObjectsInRange:NSMakeRange(1, 4)];

 

可变数组交流位置

[mArray3 exchangeObjectAtIndex:0
withObjectAtIndex:3];

 

可变数组替换

[mArray3 replaceObjectAtIndex:0
withObject:@”objxxx”];

 

可变数组插入

[mArray3 insertObject:@”iiiii”
atIndex:1];

 

可变数组遍历

int i=0;

    for (NSString *str in mArray)

{

        NSLog(@”%@”,str);

        NSLog(@”%d”,i++);

    }

 

……
1、 -(void)timetick { _d = 0; NSTimer *newtime =[NSTimer
scheduledTimerWithTimeInterval…

IOS开荒体系—Objective-C之Foundation框架

概述

笔者们前边的章节中就间接新建Cocoa
Class,那么Cocoa到底是何许,它和大家这段日子以及背后要讲的源委到底有何样关联呢?Objective-C开辟中平常应用NSObject,那么这么些指标到底是什么人?它为啥又并发在Objective-C中间呢?前天大家将揭秘这层面纱,注重深入分析在IOS开垦中八个至关心珍贵要的框架Foundation,明天的主要内容有:

 

 

为啥前边说的内容中新建二个类的时候大家都是选项Cocoa
Class呢?Cocoa是哪些啊?

 

Cocoa不是一种编制程序语言(它能够运转二种编制程序语言),它亦不是三个开采工具(通过命令行大家还能支付Cocoa程序),它是创办Mac
OS X和IOS程序的原生面向对象API,为这两个选择提供了编制程序境遇。

 

小编们常见称为“Cocoa框架”,事实上Cocoa本人是贰个框架的集合,它含有了众多子框架,个中最入眼的要数“Foundation”和“UIKit”。前者是框架的根底,和分界面非亲非故,当中积攒了汪洋常用的API;前者是基础的UI类库,未来大家在IOS开采中会日常用到。那四个框架在系统中的地方如下图:

 

Cocoa

 

实质上具有的Mac OS
X和IOS程序都是由大批量的目的构成,而那一个目的的根对象都以NSObject,NSObject就高居Foundation框架之中, 

 

普普通通大家会将他们分成几类:

 

值对象

集合

操作系统服务:文件系统、UEvoqueL、进程通讯

通知

归档和类别化

表明式和标准判断

Objective-C语言服务

UIKit主要用于分界面构架,这里我们无妨也看一下它的类协会:

 

UIKit

 

常用结构体

在Foundation中定义了繁多常用结构体类型来简化大家的平凡支付,这一个结构体完全选用Objective-C定义,和大家相依为命定义的结构体未有别的差别,之所以由框架为大家提供完全部都感到了简化大家的开销。常用的结构体有NSRange、NSPoint、NSSize、NSRect等

 

//

//  main.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

/*NSRange表示二个限制*/

void test1(){

    NSRange rg={3,5};//第一参数是开第3地点第四个参数是长度

    //NSRange rg;

    //rg.location=3;

    //rg.length=5;

    //NSRange rg={.location=3,.length=5};

    //常用上边包车型地铁不二秘诀定义 NSRange
rg2=NSMakeRange(3,5);//使用NSMakeRange定义贰个NSRange 

    //打字与印刷NSRange能够使用Foundation中方法 NSLog(@”rg2 is %@”,
NSStringFromRange(rg2));//注意无法向来NSLog(@”rg2 is %@”,
rg2),因为rg2不是目的(精确的说%@是指针)而是结构体

}

/*NSPoint表示三个点*/

void test2(){

    NSPoint p=NSMakePoint(10, 15);//NSPoint其实便是CGPoint

    //这种方法比较布满 NSPoint p2=CGPointMake(10, 15);

    NSLog(NSStringFromPoint(p2));

}

/*NSSize表示大小*/

void test3(){

    NSSize s=NSMakeSize(10, 15);//NSSize其实就是CGSize

    //这种方式相比较广泛 CGSize s2=CGSizeMake(10, 15);

    NSLog(NSStringFromSize(s2));

}

/*NSRect表示四个矩形*/

void test4(){

    NSRect r=NSMakeRect(10, 5, 100, 200);//NSRect其实便是CGRect

    //这种艺术比较宽泛 NSRect r2=CGRectMake(10, 5, 100, 200);

    NSLog(NSStringFromRect(r2));

}

 

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        test1();

        test2();

        test3();

        test4();

    } return 0;

}

能够看来对于常用结构体在Foundation框架中都有贰个相应的make方法举办创办,那也是大家之后可比常用的操作;何况与之相应的还都有二个NSStringFromXX方法来开展字符串调换,方便我们调节和测验。上面也论及NSSize其实正是CGSize,NSRect其实正是CGRect,大家能够经过查阅代码进行确认,譬喻NSSize定义:

NSSize

 

持续翻看CGSize的代码:

 

CGSize

 

日期

接下去精通一下Foundation框架中国和东瀛期的操作

 

//

//  main.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

 

int main(int argc, const char * argv[]) {

    

    NSDate *date1=[NSDate date];//获伏贴明天期

    NSLog(@”%@”,date1); //结果:2014-07-16 07:25:28 +0000

    

    NSDate *date2=[NSDate
dateWithTimeIntervalSinceNow:100];//在时下日子的根基上助长100秒,注目的在于ObjC中山大学部分光阴单位都以秒

    NSLog(@”%@”,date2); //结果:2014-07-16 07:27:08 +0000

    

    NSDate *date3=[NSDate distantFuture];//随机获取叁个以往的日子

    NSLog(@”%@”,date3); //结果:4001-01-01 00:00:00 +0000

    

    NSTimeInterval time=[date2
timeIntervalSinceDate:date1];//日期之差,重临单位为秒

    NSLog(@”%f”,time); //结果:100.008833

    

    NSDate *date5=[date1 earlierDate:date3];//再次来到相比较早的日期

    NSLog(@”%@”,date5); //结果:2014-07-16 07:25:28 +0000

    

    //日期格式化

    NSDateFormatter *formater1=[[NSDateFormatter alloc]init];

   
[email protected]”yy-MM-dd
HH:mm:ss”;

    NSString *datestr1=[formater1 stringFromDate:date1];

    NSLog(@”%@”,datestr1); //结果:14-07-16 15:25:28

    //字符串转化为日期

    NSDate *date6=[formater1 dateFromString:@”14-02-14 11:07:16″];

    NSLog(@”%@”,date6); //结果:2014-02-14 03:07:16 +0000

 

    return 0;

}

字符串

不足变字符串

 

在ObjC中字符串操作要比在C语言中简易的多,在底下的例证中您将看到字符串的初步化、大小写转化、后缀前缀推断、字符串相比、字符串截取、字符串转变等,通过上面包车型地铁例证我们基本可以驾驭常用的字符串操作(注意这一个剧情尽管基本,但却是拾贰分常用的操作,必要记住):

 

//

//  main.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

 

/**字符串操作*/

void test1(){

    char *str1=”C string”;//那是C语言创制的字符串

    NSString
*[email protected]”OC
string”;//ObjC字符串要求加@,并且这种办法成立的目的无需自身释放内部存款和储蓄器

 

    //上边包车型地铁创立方法都应有释放内部存款和储蓄器

    NSString *str3=[[NSString alloc] init];

   
[email protected]”OC
string”;

    NSString *str4=[[NSString alloc] initWithString:@”Objective-C
string”];

    NSString *str5=[[NSString alloc] initWithFormat:@”age is %i,name
is %.2f”,19,1.72f];

    NSString *str6=[[NSString alloc] initWithUTF8String:”C
string”];//C语言的字符串调换为ObjC字符串

 

   
//以上办法都有对应静态方法(一般以string开头),无需管理内部存款和储蓄器(系统静态方法一般都以电动释放)

    NSString *str7=[NSString stringWithString:@”Objective-C string”];

}

void test2(){

    NSLog(@”\”Hello world!\” to upper is %@”,[@”Hello world!”
uppercaseString]);

    //结果:”Hello world!” to upper is HELLO WORLD!

    NSLog(@”\”Hello world!\” to lowwer is %@”,[@”Hello world!”
lowercaseString]);

    //结果:”Hello world!” to lowwer is hello world!

     

    //首字母大写,别的字母小写

    NSLog(@”\”Hello world!\” to capitalize is %@”,[@”Hello world!”
capitalizedString]);

    //结果:”Hello world!” to capitalize is Hello World!

     

    BOOL result= [@”abc” isEqualToString:@”aBc”];

    NSLog(@”%i”,result);

    //结果:0

    NSComparisonResult result2= [@”abc”
compare:@”aBc”];//如果是[@”abc”
caseInsensitiveCompare:@”aBc”]则忽略大小写相比较

    if(result2==NSOrderedAscending){

        NSLog(@”left<right.”);

    }else if(result2==NSOrderedDescending){

        NSLog(@”left>right.”);

    }else if(result2==NSOrderedSame){

        NSLog(@”left=right.”);

    }

    //结果:left>right.

}

void test3(){

    NSLog(@”has prefix ab? %i”,[@”abcdef” hasPrefix:@”ab”]);

    //结果:has prefix ab? 1

    NSLog(@”has suffix ab? %i”,[@”abcdef” hasSuffix:@”ef”]);

    //结果:has suffix ab? 1

    NSRange range=[@”abcdefabcdef”
rangeOfString:@”cde”];//注意假如高出cde则不再往背后寻找,如若在此以前边寻觅或其它找寻形式得以设置第1个options参数

    if(range.location==NSNotFound){

        NSLog(@”not found.”);

    }else{

        NSLog(@”range is %@”,NSStringFromRange(range));

    }

    //结果:range is {2, 3}

}

//字符串分割

void test4(){

    NSLog(@”%@”,[@”abcdef”
substringFromIndex:3]);//从第八个目录开端(包涵第多少个目录对应的字符)截取到终极一人

    //结果:def

    NSLog(@”%@”,[@”abcdef”
substringToIndex:3]);////从0开首截取到第4个目录(不包涵第4个目录对应的字符)

    //结果:abc

    NSLog(@”%@”,[@”abcdef” substringWithRange:NSMakeRange(2, 3)]);

    //结果:cde

    NSString
*[email protected]”12.abcd.3a”;

    NSArray *array1=[str1
componentsSeparatedByString:@”.”];//字符串分割

    NSLog(@”%@”,array1);

     /*结果:

      (

         12,

         abcd,

         3a

      )

      */

 

}

//别的操作

void test5(){

    NSLog(@”%i”,[@”12″ intValue]);//类型转换

    //结果:12

    NSLog(@”%zi”,[@”hello world,世界你好!”
length]);//字符串长度注意不是字节数

    //结果:17

    NSLog(@”%c”,[@”abc” characterAtIndex:0]);//收取制订地点的字符

    //结果:a

    const char *s=[@”abc” UTF8String];//转变为C语言字符串

    NSLog(@”%s”,s);

    //结果:abc

}

 

int main(int argc, const char * argv[]) {

    test1();

    test2();

    test3();

    test4();

    test5();

    return 0;

}

推而广之–文件操作

 

在ObjC中路线、文件读写等操作是运用字符串来达成的,这里经过多少个简易的例子来演示(首先在桌面上新建四个test.txt文件,里面积累的内容是”hello
world,世界你好!”)

 

//

//  main.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

 

void test1(){

    //读取文件内容

    NSString
*[email protected]”/Users/kenshincui/Desktop/test.txt”;

    NSString *str1=[NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding error:nil];

    //注意上边也能够行使gb2312
gbk等,举个例子kCFStringEncodingGB_18030_2000,可是须要用CFStringConvertEncodingToNSStringEncoding调换

    NSLog(@”str1 is %@”,str1);

    //结果:str1 is hello world,世界你好!

 

    

    

    

    //上面咱们来看了读取文件,但并不曾处理错误,当然在ObjC中可以@try
@catch @finnally但平时大家并不那么做

   
//由于我们的test.txt中有汉语,所以利用上面包车型客车编码读取会报错,下面包车型客车代码演示了错误获取的进程

    NSError *error;

    NSString *str2=[NSString stringWithContentsOfFile:path
encoding:kCFStringEncodingGB_18030_2000
error:&error];//注意那句话中的error变量是**error,正是指针的指针那就是指针的地点,由于error正是三个指南针此处也正是error的地址&error,具体原因见上面补充

    if(error){

        NSLog(@”read error ,the error is %@”,error);

    }else{

        NSLog(@”read success,the file content is %@”,str2);

    }

    //结果:read error ,the error is Error Domain=NSCocoaErrorDomain
Code=261 “The file couldn’t be opened using the specified text
encoding.” UserInfo=0x100109620
{NSFilePath=/Users/kenshincui/Desktop/test.txt, NSStringEncoding=1586}

 

    

    

    

   
//读取文件内容还有一种格局正是应用UCR-Vl,它除了能够读取当三步跳件还是能读取互联网文件

    //NSURL *url=[NSURL
URLWithString:@”file:///Users/kenshincui/Desktop/test.txt”];

    NSURL *url=[NSURL URLWithString:@”];

    NSString *str3=[NSString stringWithContentsOfURL:url
encoding:NSUTF8StringEncoding error:nil];

    NSLog(@”str3 is %@”,str3);

}

void test2(){

    //下边是文本写入

    NSString
*[email protected]”/Users/kenshincui/Desktop/test2.txt”;

    NSError *error1;

    NSString
*[email protected]”hello
world,世界你好!”;

    [str11 writeToFile:path1 atomically:YES
encoding:NSUTF8StringEncoding
error:&error1];//automically代表壹遍性写入,假诺写到中间出错了最后就总体不写入

    if(error1){

        NSLog(@”write fail,the error is %@”,[error1
localizedDescription]);//调用localizedDescription是只打印关键错误消息

    }else{

        NSLog(@”write success!”);

    }

    //结果:write success!

}

//路线操作

void test3(){

    NSMutableArray *marray=[NSMutableArray array];//可变数组

    [marray addObject:@”Users”];

    [marray addObject:@”KenshinCui”];

    [marray addObject:@”Desktop”];

 

    NSString *path=[NSString pathWithComponents:marray];

    NSLog(@”%@”,path);//字符串拼接成路径

    //结果:Users/KenshinCui/Desktop

 

    NSLog(@”%@”,[path pathComponents]);//路线分割成数组

    /*结果: 

     (

        Users,

        KenshinCui,

        Desktop

    )

    */

 

    NSLog(@”%i”,[path
isAbsolutePath]);//是还是不是觉对路径(其实正是看字符串是或不是以“/”开始)

    //结果:0

    NSLog(@”%@”,[path lastPathComponent]);//获得最终二个索引

    //结果:Desktop

    NSLog(@”%@”,[path
stringByDeletingLastPathComponent]);//删除最终八个目录,注意path本人是常量不会被涂改,只是重回一个新字符串

    //结果:Users/KenshinCui

    NSLog(@”%@”,[path
stringByAppendingPathComponent:@”Documents”]);//路线拼接

    //结果:Users/KenshinCui/Desktop/Documents

}

 //增添名操作

void test4(){

    NSString
*[email protected]”Users/KenshinCui/Desktop/test.txt”;

    NSLog(@”%@”,[path
pathExtension]);//猎取增加名,注意ObjC中增添名不富含”.”

    //结果:txt

    NSLog(@”%@”,[path
stringByDeletingPathExtension]);//删除扩充名,注意包蕴”.”

    //结果:Users/KenshinCui/Desktop/test

    NSLog(@”%@”,[@”Users/KenshinCui/Desktop/test”
stringByAppendingPathExtension:@”mp3″]);//添加扩张名

    //结果:Users/KenshinCui/Desktop/test.mp3

}

 

int main(int argc, const char * argv[]) {

    test1();

    test2();

    test3();

    test4();

    return 0;

}

在意:在地点的例证中大家用到了可变数组,上边会特意介绍。

 

可变字符串

 

大家知道在字符串操作进程中我们日常希望改换原来的字符串,当然那在C语言中贯彻比较复杂,可是ObjC为大家提供了新的可变字符串类NSMutableString,它是NSString的子类。

 

//

//  main.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

 

int main(int argc, const char * argv[]) {

    

    /*可变字符串,注意NSMutableString是NSString子类*/

   
//注意尽管initWithCapacity分配字符串大小,可是或不是相对的不能超越此限制,申明此变量对品质有裨益

    NSMutableString *str1= [[NSMutableString alloc]
initWithCapacity:10];

    [str1 setString:@”hello”];//设置字符串

    NSLog(@”%@”,str1);

    //结果:hello

 

    [str1 appendString:@”,world!”];//追加字符串

    NSLog(@”%@”,str1);

    //结果:hello,world!

 

    [str1 appendFormat:@”作者的岁数是%i。dear,I love you.”,18];

    NSLog(@”%@”,str1);

    //结果:hello,world!笔者的年纪是18。dear,I love you.

    

    //替换字符串

    NSRange range=[str1 rangeOfString:@”dear”];

    [str1 replaceCharactersInRange:range withString:@”Honey”];

    NSLog(@”%@”,str1);

    //结果:hello,world!笔者的年纪是18。Honey,I love you.

    

    //插入字符串

    [str1 insertString:@”My name is Kenshin.” atIndex:12];

    NSLog(@”%@”,str1);

    //结果:hello,world!My name is Kenshin.作者的年纪是18。Honey,I love
you.

    

    //删除钦点字符串

    [str1 deleteCharactersInRange:[str1 rangeOfString:@”My name is
Kenshin.”]];//删除内定范围的字符串

    NSLog(@”%@”,str1);

    //结果:hello,world!作者的年华是18。Honey,I love you.

    

    return 0;

}

数组

不得变数组

 

下边将演示常用的数组操作:开头化、数组对象的办法实践、数组成分的遍历、在原有数组基础上发出新数组、数组排序等

 

//

//  main.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

#import “Person.h”

 

 

void test1(){

    //NSArray长度不可变所以伊始化的时候就赋值,并且最终以nil结尾

    //其余部供给要注意NSArray无法存放C语言的基本功项目

    NSObject *obj=[[NSObject alloc]init];

    //NSArray *array1=[[NSArray alloc]
initWithObjects:@”abc”,obj,@”cde”,@”opq”, nil];

    NSArray *array1=[NSArray
arrayWithObjects:@”abc”,obj,@”cde”,@”opq”,@25, nil];

    NSLog(@”%zi”,array1.count);//数主管度,结果:5

    NSLog(@”%i”,[array1
containsObject:@”cde”]);//是还是不是包蕴有个别对象,结果:1

    NSLog(@”%@”,[array1 lastObject]);//最后三个对象,结果:25

    NSLog(@”%zi”,[array1 indexOfObject:@”abc”]);//对象所在的地方:0

    

    Person *person1=[Person personWithName:@”Kenshin”];

    Person *person2=[Person personWithName:@”Kaoru”];

    Person *person3=[Person personWithName:@”Rosa”];

    NSArray *array2=[[NSArray
alloc]initWithObjects:person1,person2,person3, nil];

    [array2 makeObjectsPerformSelector:@selector(showMessage:)
withObject:@”Hello,world!”];//施行全部因素的showMessage方法,后边的参数最六只好有贰个

    /*结果:

     My name is Kenshin,the infomation is “Hello,world!”.

     My name is Kaoru,the infomation is “Hello,world!”.

     My name is Rosa,the infomation is “Hello,world!”.

     */

}

//数组的遍历

void test2(){

    NSObject *obj=[[NSObject alloc]init];

    NSArray *array=[[NSArray alloc]
initWithObjects:@”abc”,obj,@”cde”,@”opq”,@25, nil];

    //方法1

    for(int i=0,len=array.count;i<len;++i){

        NSLog(@”method1:index %i is %@”,i,[array objectAtIndex:i]);

    }

    /*结果:

     method1:index 0 is abc

     method1:index 1 is <NSObject: 0x100106de0>

     method1:index 2 is cde

     method1:index 3 is opq

     method1:index 4 is 25

     */

    

    

    //方法2

    for(id obj in array){

        NSLog(@”method2:index %zi is %@”,[array
indexOfObject:obj],obj);

    }

    /*结果:

     method2:index 0 is abc

     method2:index 1 is <NSObject: 0x100602f00>

     method2:index 2 is cde

     method2:index 3 is opq

     method2:index 4 is 25

     */

    

    

    //方法3,利用代码块方法

    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL
*stop) {

        NSLog(@”method3:index %zi is %@”,idx,obj);

        if(idx==2){//当idx=2时设置*stop为YES结束遍历

            *stop=YES;

        }

    }];

    /*结果:

     method3:index 0 is abc

     method3:index 1 is <NSObject: 0x100106de0>

     method3:index 2 is cde

     */

    

    

    //方法4,利用迭代器

    //NSEnumerator *enumerator= [array
objectEnumerator];//获得一个迭代器

    NSEnumerator *enumerator=[array
reverseObjectEnumerator];//获取三个反向迭代器

    //NSLog(@”all:%@”,[enumerator
allObjects]);//获取具备迭代对象,注意调用完此方法迭代器就遍历完了,上面包车型客车nextObject就从未有过值了

    id obj2=nil;

    while (obj2=[enumerator nextObject]) {

        NSLog(@”method4:%@”,obj2);

    }

    /*结果:

     method4:25

     method4:opq

     method4:cde

     method4:<NSObject: 0x100106de0>

     method4:abc

     */

}

//数组织派遣生出新的数组

void test3(){

    NSArray *array=[NSArray arrayWithObjects:@”1″,@”2″,@”3″, nil];

    NSArray *array2=[array
arrayByAddingObject:@”4″];//注意此时array并从未变

    NSLog(@”%@”,array2);

    /*结果:

     (

         1,

         2,

         3,

         4

     )

     */

    

    

    NSLog(@”%@”,[array2 arrayByAddingObjectsFromArray:[NSArray
arrayWithObjects:@”5″,@”6″, nil]]);//追加形成新的数组

    /*结果:

     (

         1,

         2,

         3,

         4,

         5,

         6

     )

     */

    

    

    NSLog(@”%@”,[array2 subarrayWithRange:NSMakeRange(1,
3)]);//根据早晚范围获得生成贰个新的数组

    /*结果:

     (

         2,

         3,

         4

     )

     */

    

    

    NSLog(@”%@”,[array
componentsJoinedByString:@”,”]);//数组连接,造成二个字符串

    //结果:1,2,3

    

    //读写文件

    NSString
*[email protected]”/Users/KenshinCui/Desktop/array.xml”;

    [array writeToFile:path atomically:YES];

    NSArray *array3=[NSArray arrayWithContentsOfFile:path];

    NSLog(@”%@”,array3);

    /*结果:

     (

         1,

         2,

         3

     )

     */

}

//数组排序

void test4(){

    //方法1,使用自带的比较器

    NSArray *array=[NSArray arrayWithObjects:@”3″,@”1″,@”2″, nil];

    NSArray *array2= [array
sortedArrayUsingSelector:@selector(compare:)];

    NSLog(@”%@”,array2);

    /*结果:

     (

         1,

         2,

         3

     )

     */

    

    

    //方法2,自个儿定义比较器

    Person *person1=[Person personWithName:@”Kenshin”];

    Person *person2=[Person personWithName:@”Kaoru”];

    Person *person3=[Person personWithName:@”Rosa”];

    NSArray *array3=[NSArray arrayWithObjects:person1,person2,person3,
nil];

    NSArray *array4=[array3
sortedArrayUsingSelector:@selector(comparePerson:)];

    NSLog(@”%@”,array4);

    /*结果:

     (

         “name=Kaoru”,

         “name=Kenshin”,

         “name=Rosa”

     )

     */

    

    

    //方法3使用代码块

    NSArray *array5=[array3
sortedArrayUsingComparator:^NSComparisonResult(Person *obj1, Person
*obj2) {

        return [obj2.name compare:obj1.name];//降序

    }];

    NSLog(@”%@”,array5);

    /*结果:

     (

         “name=Rosa”,

         “name=Kenshin”,

         “name=Kaoru”

     )

     */

    

    

    //方法4 由此描述器定义排序准则

    Person *person4=[Person personWithName:@”Jack”];

    Person *person5=[Person personWithName:@”Jerry”];

    Person *person6=[Person personWithName:@”Tom”];

    Person *person7=[Person personWithName:@”Terry”];

    NSArray *array6=[NSArray
arrayWithObjects:person4,person5,person6,person7, nil];

    //定义叁个排序描述

    NSSortDescriptor *personName=[NSSortDescriptor
sortDescriptorWithKey:@”name” ascending:YES];

    NSSortDescriptor *accountBalance=[NSSortDescriptor
sortDescriptorWithKey:@”account.balance” ascending:YES];

    NSArray *des=[NSArray arrayWithObjects:personName,accountBalance,
nil];//先遵照person的name排序再依照account的balance排序

    NSArray *array7=[array6 sortedArrayUsingDescriptors:des];

    NSLog(@”%@”,array7);

    /*结果:

     (

         “name=Jack”,

         “name=Jerry”,

         “name=Terry”,

         “name=Tom”

     )

     */

}

 

int main(int argc, const char * argv[]) {

    test1();

    test2();

    test3();

    test4();

    return 0;

}

供给留心几点:

 

NSArray中只好寄存对象,不能够寄存基本数据类型,经常我们得以经过在大旨数据类型前加@实行转移;

数组中的成分前面总得加nil以代表数据甘休;

makeObjectsPerformSelector推行数组中目的的主意,其参数最八只好有二个;

上边数组操作中不管数组的扩张、删除、截取都不曾改动原本的数组,只是爆发了新的数组而已;

对象的相比除了使用系统自带的主意,大家得以因而自定义比较器的秘籍来落到实处;

可变数组

 

上面看一下可变数组的内容:

 

//

//  main.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

#import “Person.h”

 

 

void test1(){

    Person *person1=[Person personWithName:@”Kenshin”];

    Person *person2=[Person personWithName:@”Kaoru”];

    Person *person3=[Person personWithName:@”Rosa”];

    NSMutableArray *array1=[NSMutableArray
arrayWithObjects:person1,person2,person3, nil];

    NSLog(@”%@”,array1);

    /*结果:

     (

         “name=Kenshin”,

         “name=Kaoru”,

         “name=Rosa”

     )

     */

    

    Person *person4=[Person
personWithName:@”Jack”];//此时person4的retainCount为1

    [array1
addObject:person4];//增添贰个因素,此时person4的retainCount为2

    NSLog(@”%@”,array1);

    /*结果:

     (

         “name=Kenshin”,

         “name=Kaoru”,

         “name=Rosa”,

         “name=Jack”

     )

     */

    

    [array1 removeObject:person3];//删除四个元素

    NSLog(@”%@”,array1);

    /*结果:

     (

         “name=Kenshin”,

         “name=Kaoru”,

         “name=Jack”

     )

     */

    

    [array1
removeLastObject];//删除最后贰个元素,//此时person4的retainCount为1

    NSLog(@”%@”,array1);

    /*结果:

     (

         “name=Kenshin”,

         “name=Kaoru”

     )

     */

    

    [array1 removeAllObjects];//删除所以成分

    

   
//注意当往数组中增多二个要素时会retain由此计数器+1,当从数组中移除二个成分时会release因而计数器-1

    //当NSMutalbeArray对象release的时候会相继调用每多少个对象的release

}

void test2(){

    NSMutableArray *array1=[NSMutableArray
arrayWithObjects:@”1″,@”3″,@”2″, nil];

    NSLog(@”%@”,array1);

    /*结果:

     (

         1,

         3,

         2

     )

     */

    

    NSArray *array2= [array1
sortedArrayUsingSelector:@selector(compare:)];//注意那些措施未有修改array1

    NSLog(@”%@”,array1);

    /*结果:

     (

         1,

         3,

         2

     )

     */

    

    NSLog(@”%@”,array2);

    /*结果:

     (

         1,

         2,

         3

     )

     */

    [array1
sortUsingSelector:@selector(compare:)];//那些方法会修改array1

    NSLog(@”%@”,array1);

    /*结果:

     (

         1,

         2,

         3

     )

     */

    

}

 

int main(int argc, const char * argv[]) {

    

    test1();

    

    test2();

    

    return 0;

}

可变数组中的成分前边总得加nil以代表数据停止;

往三个可变数组中增加三个对象,此时以此目标的援用计数器会加1,当以此指标从可变数组中移除其引用计数器减1。同有的时候间当一切数组销毁之后会挨个调用每种对象的releaes方法。

在不可变数组中不管对数组怎么排序,原本的数组顺序都不会改造,不过在可变数组中一旦运用sortUsingSelector:排序原来的数组顺序就生出了变化。

 

 

字典

字典在我们平常支出中也是相比较常用的,通过下边包车型地铁代码我们看一下在ObjC中的字典的常用操作:开头化、遍历、排序

 

//

//  main.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

 

void test1(){

    NSDictionary *dic1=[NSDictionary dictionaryWithObject:@”1″
forKey:@”a”];

    NSLog(@”%@”,dic1);

    /*结果:

     {

        a = 1;

     }

     */

    

    //常用的主意

    NSDictionary *dic2=[NSDictionary dictionaryWithObjectsAndKeys:

                        @”1″,@”a”,

                        @”2″,@”b”,

                        @”3″,@”c”,

                        nil];

    NSLog(@”%@”,dic2);

    /*结果:

     {

         a = 1;

         b = 2;

         c = 3;

     }

     */

    

    

    NSDictionary *dic3=[NSDictionary dictionaryWithObjects:[NSArray
arrayWithObjects:@”1″,@”2″, nil] forKeys:[NSArray
arrayWithObjects:@”a”,@”b”, nil]];

    NSLog(@”%@”,dic3);

    /*结果:

     {

         a = 1;

         b = 2;

     }

     */

    

    

    //更简明的措施

    NSDictionary
*[email protected]{@”1″:@”a”,@”2″:@”b”,@”3″:@”c”};

    NSLog(@”%@”,dic4);

    /*结果:

     {

         1 = a;

         2 = b;

         3 = c;

     }

     */

}

void test2(){

    NSDictionary *dic1=[NSDictionary dictionaryWithObjectsAndKeys:

                        @”1″,@”a”,

                        @”2″,@”b”,

                        @”3″,@”c”,

                        @”2″,@”d”,

                        nil];

    NSLog(@”%zi”,[dic1 count]); //结果:4

    NSLog(@”%@”,[dic1 valueForKey:@”b”]);//依据键猎取值,结果:2

    NSLog(@”%@”,dic1[@”b”]);//还足以那样读取,结果:2

    NSLog(@”%@,%@”,[dic1 allKeys],[dic1 allValues]);

    /*结果:

     (

         d,

         b,

         c,

         a

     ),(

         2,

         2,

         3,

         1

     )

 

     */

    

    NSLog(@”%@”,[dic1 objectsForKeys:[NSArray
arrayWithObjects:@”a”,@”e” , nil]notFoundMarker:@”not
fount”]);//后边多个参数notFound马克尔是即使找不到对应的key用什么值代替

    /*结果:

     (

         1,

         “not fount”

     )

     */

}

void test3(){

    NSDictionary *dic1=[NSDictionary dictionaryWithObjectsAndKeys:

                        @”1″,@”a”,

                        @”2″,@”b”,

                        @”3″,@”c”,

                        @”2″,@”d”,

                        nil];

    //遍历1

    for (id key in dic1) {//注意对于字典for遍历循环的是key

        NSLog(@”%@=%@”,key,[dic1 objectForKey:key]);

    }

    /*结果:

     d=2

     b=2

     c=3

     a=1

     */

    

    //遍历2

    NSEnumerator *enumerator=[dic1
keyEnumerator];//还大概有值的迭代器[dic1 objectEnumerator]

    id key=nil;

    while (key=[enumerator nextObject]) {

        NSLog(@”%@=%@”,key,[dic1 objectForKey:key]);

        

    }

    /*结果:

     d=2

     b=2

     c=3

     a=1

     */

    

    //遍历3

    [dic1 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL
*stop) {

        NSLog(@”%@=%@”,key,obj);

    }];

    /*结果:

     d=2

     b=2

     c=3

     a=1

     */

}

 

void test4(){

    NSMutableDictionary *dic=[NSMutableDictionary
dictionaryWithObjectsAndKeys:@”1″,@”a”,

                              @”2″,@”b”,

                              @”3″,@”c”,

                              @”2″,@”d”,

                            nil];

    [dic removeObjectForKey:@”b”];

    NSLog(@”%@”,dic);

    /*结果:

     {

         a = 1;

         c = 3;

         d = 2;

     }

     */

    

    [dic addEntriesFromDictionary:@{@”e”:@”7″,@”f”:@”6″}];

    NSLog(@”%@”,dic);

    /*结果:

     {

         a = 1;

         c = 3;

         d = 2;

         e = 7;

         f = 6;

     }

     */

    

    [dic setValue:@”5″ forKey:@”a”];

    NSLog(@”%@”,dic);

    /*结果:

     {

         a = 5;

         c = 3;

         d = 2;

         e = 7;

         f = 6;

     }

     */

     

    

   
//注意,贰个字典的key或value增加到字典中时计数器+1;字典释放时调用key或value的release二回,计数器-1

}

 

 

int main(int argc, const char * argv[]) {

    test1();

    test2();

    test3();

    test4();

    return 0;

}

在意:同数组同样,不管是可变字典照旧不行变字典初阶化成分后边总得抬高nil以象征甘休。

 

装箱和拆箱

实际从地点的事例中大家也能够见到,数组和字典中不得不存款和储蓄对象类型,其余大旨类型和布局体是未有议程放到数组和字典中的,当然你也是无力回天给它们发送消息的(也正是说有个别NSObject的不二秘籍是不可能调用的),这一年常见会用到装箱(boxing)和拆箱(unboxing)。其实各样高端语言基本上都有装箱和拆箱的历程,比方C#中大家将中心数据类型转化为Object正是二个装箱的长河,将以此Object对象调换为大旨数据类型的进度便是拆箱,并且在C#中装箱的长河能够自动完结,基本数据类型能够一贯赋值给Object对象。但是在ObjC中装箱的进程必需手动实现,ObjC不扶助自动装箱。

 

在ObjC中我们一般将主导数据类型装箱成NSNumber类型(当然它也是NSObject的子类,不过NSNumber不能够对协会体装箱),调用其相应的方法进行转变:

 

+(NSNumber *)numberWithChar:(char)value;

 

+(NSNumber *)numberWithInt:(int)value;

 

+(NSNumber *)numberWithFloat:(float)value;

 

+(NSNumber *)numberWithDouble:(double)value;

 

+(NSNumber *)numberWithBool:(BOOL)value;

 

+(NSNumber *)numberWithInteger:(NSInteger)value;

 

拆箱的经过就尤其简明了,能够调用如下方法:

 

-(char)charValue;

 

-(int)intValue;

 

-(float)floatValue;

 

-(double)doubleValue;

 

-(BOOL)boolValue;

 

简单看多少个例子

 

//

//  main.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

 

/*能够寄放基本类型到数组、字典*/

void test1(){

    //包装类NSNumber,能够打包中央类型但是无法包装结构体类型

    NSNumber *number1=[NSNumber
numberWithChar:’a’];//’a’是二个C语言的char类型我们鞭长莫及放倒NSArray中,可是我们得以经过NSNumber包装

    NSArray *array1=[NSArray arrayWithObject:number1];

    NSLog(@”%@”,array1);

    /*结果:

     (

        97

     )

     */

    

    NSNumber *number2= [array1 lastObject];

    NSLog(@”%@”,number2);//重回的不是主导项目,结果:97

    

    

    char char1=[number2 charValue];//number转化为char

    NSLog(@”%c”,char1); //结果:a

}

 

int main(int argc, const char * argv[]) {

    test1();

    return  0;

}

上面大家见到了大旨数据类型的装箱和拆箱进度,那么结构体呢?那一年我们须要引进其余二个门类NSValue,其实上边的NSNumber正是NSValue的子类,它包裹了一部分宗旨数据类型的常用装箱、拆箱方法,当要对结构体举行装箱、拆箱操作大家供给采用NSValue,NSValue能够对另外数据类型举行装箱、拆箱操作。

 

实际上对于常用的结构体Foundation已经为大家提供好了现实的装箱方法:

 

+(NSValue *)valueWithPoint:(NSPoint)point;

 

+(NSValue *)valueWithSize:(NSSize)size;

 

+(NSValue *)valueWithRect:(NSRect)rect;

 

对应的拆箱方法:

 

-(NSPoint)pointValue;

 

-(NSSize)sizeValue;

 

-(NSRect)rectValue;

 

//

//  main.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

//NSNumber是NSValue的子类,而NSValue能够打包任何类型,包罗结构体

void test1(){

    CGPoint point1=CGPointMake(10, 20);

    NSValue *value1=[NSValue
valueWithPoint:point1];//对于系统自带类型一般都有平素的办法举行李包裹装

    NSArray *array1=[NSArray arrayWithObject:value1];//放尾数组中

    NSLog(@”%@”,array1);

    /*结果:

     (

        “NSPoint: {10, 20}”

     )

     */

    

    NSValue *value2=[array1 lastObject];

    CGPoint point2=[value2
pointValue];//一样对于系统自带的布局体有对应的取值方法(比方本例pointValue)

   
NSLog(@”x=%f,y=%f”,point2.x,point2.y);//结果:x=10.000000,y=20.000000

}

 

 

int main(int argc, const char * argv[]) {

    test1();

    return  0;

}

 

 

那么一旦是大家自定义的布局体类型呢,这年我们必要使用NSValue如下方法举办李装运箱:

 

+(NSValue *)valueWithBytes:(const void *)value objCType:(const char
*)type;

 

调用上边包车型地铁主意开展拆箱:

 

-(void)getValue:(void *)value;

 

//

//  main.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

typedef struct {

    int year;

    int month;

    int day;

} Date;

 

 

//NSNumber是NSValue的子类,而NSValue可以打包任何类型,满含结构体

void test1(){

    //如若大家和好定义的结构体包装

    Date date={2014,2,28};

    char
*[email protected](Date);

    NSValue *value3=[NSValue value:&date
withObjCType:type];//第一参数字传送递结构体地址,首个参数字传送递类型字符串

    NSArray *array2=[NSArray arrayWithObject:value3];

    NSLog(@”%@”,array2);

    /*结果:

     (

        “<de070000 02000000 1c000000>”

     )

     */

    

    Date date2;

    [value3 getValue:&date2];//抽出对应的结构体,注意未有重回值

    //[value3 objCType]//抽取包装内容的花色

    NSLog(@”%i,%i,%i”,date2.year,date2.month,date2.day);
//结果:2014,2,28

    

}

 

 

int main(int argc, const char * argv[]) {

    test1();

    return  0;

}

扩展1-NSNull

 

通过前边的介绍大家都通晓不管在数组照旧在字典中都亟须以nil结尾,不然数组或字典不可能剖断是不是那么些数组或字典已经竣事(与C语言中的字符串相比像样,C语言中定义字符串前面总得加一个”\0”)。可是大家临时候确实想在数量或字典中存款和储蓄nil值实际不是作为完毕标识如何是好吧?那一年要求选拔NSNull,这几个类是四个单例,只有叁个null方法。轻易看一下:

 

//

//  main.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

 

 

int main(int argc, const char * argv[]) {

    

    NSNull *nl=[NSNull
null];//注意那是三个目的,是四个单例,独有叁个主意null创立三个对象

    NSNull *nl2=[NSNull null];

    NSLog(@”%i”,nl==nl2);//由于是单例所以地方相等,结果:1

    

    NSArray *array1=[NSArray arrayWithObjects:@”abc”,nl,@123, nil];

    NSLog(@”%@”,array1);

    /*结果:

     (

         abc,

         “<null>”,

         123

     )

     */

 

    return  0;

}

 

 

扩展[email protected]符号

 

笔者们驾驭在ObjC中过多种中之重字前都不能够不抬高@符号,比方@protocol、@property等,当然ObjC中的字符串必得运用@符号,还应该有正是%@能够象征输出三个指标。其实@符号在新版的ObjC中还恐怕有两个效应:装箱。

 

信任聪明的童鞋在前面包车型大巴例证中早就观看了,这里大约的牵线一下(在上面包车型客车亲自过问中你也将看到相当多ObjC新特色)。

 

//

//  main.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

typedef enum {

    spring,

    summer,

    autumn,

    winter

} Season;

 

int main(int argc, const char * argv[]) {

    /*装箱*/

    NSNumber
*[email protected];

    NSArray *array1=[NSArray
arrayWithObjects:number1,@”abc”,@16,@’A’,@16.7,@YES, nil];

    NSLog(@”%@”,array1);

    /*结果:

     (

         100,

         abc,

         16,

         65,

         “16.7”

         1

     )

     */

    NSNumber
*[email protected](1+2*3);

    NSLog(@”%@”,number2); //结果:7

    NSNumber
*[email protected](autumn);

    NSLog(@”%@”,number3); //结果:2

    

 

    NSArray
*[email protected][@”abc”,@16,@’A’,@16.7,@YES];//使用这种措施最终不用增添nil值了

    NSLog(@”%@”,array2[2]); //结果:65

    NSMutableArray *array3=[NSMutableArray arrayWithArray:array2];

   
array3[0][email protected]”def”;

    NSLog(@”%@”,array3[0]); //结果:def

    

    NSDictionary
*[email protected]{@”a”:@123,@”b”:@’c’,@”c”:@YES};

    NSLog(@”%@”,dic1);

    /*结果:

     {

         a = 123;

         b = 99;

         c = 1;

     }

     */

    NSMutableDictionary *dic2=[NSMutableDictionary
dictionaryWithDictionary:dic1];

   
dic2[@”a”][email protected];

    NSLog(@”%@”,dic2[@”a”]);//结果:456

 

    return 0;

}

反射

出于ObjC动态性,在ObjC中达成反射能够说是一定轻松,下边代码中示范了常用的反射操作,具体作用也都在代码中进行了讲明表明:

 

Account.h

 

//

//  Account.h

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

@interface Account : NSObject

 

@property (nonatomic,assign) double balance;

 

@end

Account.m

 

//

//  Account.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import “Account.h”

 

@implementation Account

 

@end

Person.h

 

//

//  Person.h

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

@class Account;

 

@interface Person : NSObject

 

@property (nonatomic,copy) NSString *name;

@property (nonatomic,retain) Account *account;

 

-(Person *)initWithName:(NSString *)name;

 

+(Person *)personWithName:(NSString *)name;

 

-(void)showMessage:(NSString *)infomation;

 

//本身完毕目的比较艺术

-(NSComparisonResult)comparePerson:(Person *)person;

@end

Person.m

 

//

//  Person.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import “Person.h”

 

@implementation Person

 

-(Person *)initWithName:(NSString *)name{

    if(self=[super init]){

        self.name=name;

    }

    return self;

}

 

+(Person *)personWithName:(NSString *)name{

    Person *person=[[Person alloc]initWithName:name];

    return person;

}

 

-(void)showMessage:(NSString *)infomation{

    NSLog(@”My name is %@,the infomation is
\”%@\”.”,_name,infomation);

}

 

//自身实现目标比较艺术

-(NSComparisonResult)comparePerson:(Person *)person{

    return [_name compare:person.name];

}

 

-(NSString *)description{

    return [NSString stringWithFormat:@”name=%@”,_name];

}

 

@end

main.m

 

//

//  main.m

//  FoundationFramework

//

//  Created by Kenshin Cui on 14-2-16.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//

 

#import <Foundation/Foundation.h>

#import “Person.h”

 

 

int main(int argc, const char * argv[]) {

    /*常用方法*/

    Person *person1=[Person personWithName:@”Kenshin”];

    NSLog(@”%i”,[person1 isKindOfClass:[NSObject class]]);
//判别一个指标是或不是为某连串型(要是是父类也回到YES),结果:1

    NSLog(@”%i”,[person1 isMemberOfClass:[NSObject class]]);
//剖断三个目的是或不是是有些类的实例化对象,结果:0

    NSLog(@”%i”,[person1 isMemberOfClass:[Person class]]); //结果:1

    NSLog(@”%i”,[person1
conformsToProtocol:@protocol(NSCopying)]);//是不是落实了某些左券,结果:0

    NSLog(@”%i”,[person1
respondsToSelector:@selector(showMessage:)]);//是或不是留存某些方法,结果:1

    

    [person1 showMessage:@”Hello,world!”];//间接调用三个办法

    [person1 performSelector:@selector(showMessage:)
withObject:@”Hello,world!”];

   
//动态调用一个格局,注意就算有参数那么参数类型只好为ObjC对象,并且最两只可以有多少个参数

 

    

    /*反射*/

    //动态生成一个类

    NSString
*[email protected]”Person”;

    Class myClass=NSClassFromString(className);//依照类名生成类

    Person *person2=[[myClass alloc]init]; //实例化

   
[email protected]”Kaoru”;

    NSLog(@”%@”,person2);//结果:name=Kaoru

 

    //类转化为字符串

    NSLog(@”%@,%@”,NSStringFromClass(myClass),NSStringFromClass([Person
class])); //结果:Person,Person

 

    //调用艺术

    NSString
*[email protected]”showMessage:”;

    SEL mySelector=NSSelectorFromString(methodName);

    Person *person3=[[myClass alloc]init];

   
[email protected]”Rosa”;

    [person3 performSelector:mySelector withObject:@”Hello,world!”];
//结果:My name is Rosa,the infomation is “Hello,world!”.

 

    //方法转化为字符串

    NSLog(@”%@”,NSStringFromSelector(mySelector)); //结果:showMessage:

    

    return 0;

}

概述
大家方今的章节中就一向新建Cocoa
Class,那么Cocoa到底是何等,它和我们前边以及背后要讲的内容…

ios9基础知识总计(foundation)笔记,ios9foundation

类:NSObject
、NSString、NSMutableString、NSNumber、NSValue、NSDate、NSDateFormatter、NSRange、Collections:NSSet、NSArray(Ordered、Copy)、NSMutableArray、NSMutableSet、NSDictionary

 

========================================================================================

知识点

一、NSObject类

1.NSObject的概述

提供了系统运维时的一部分基本作用

1.指标的创始、销毁

alloc init new dealloc

2. 类的发轫化

          1.类加载的时候,自动调用+load方法 

          2.第一回选取类的时候,自动调用+initailize方法

    类在利用在此以前会推行此措施,并且只举行贰回(直接能够在.m中调用此方法)

 

2.copy方法

   1.实际不是具有目标都有copy方法

   2.假设三个对象帮助copy功用,会将对象复制一份(深拷贝)

          a.首先要严守左券NSCopying左券.h文件,

          b.必得达成copyWithZone方法公约.m文件

   3.若是不但想复制对象,何况还要复制对象的值,

     一般还要重写属性的有参的开始化方法,把self.参数值一齐经过return重回

TRStudent.h

#import <Foundation/Foundation.h>

 

@interface TCR-VStudent :
NSObject<NSCopying>//遵循NSCopying探究,技巧促成深拷贝

@property int i;

-(id)initWithI:(int)i;

@end

 

TRStudent.m

#import “TRStudent.h”

 

@implementation TRStudent

+(void)load{

    NSLog(@”load”);

}

+(void)initialize{

    NSLog(@”initialize”);

 

}

 

//开首化方法

-(id)initWithI:(int)i{

    if ([super init]) {

        self.i=i;

    }

    return self;

}

//服从NSCopying和煦,完成形式

-(id)copyWithZone:(NSZone *)zone{

    return [[TRStudent alloc]initWithI:self.i];//深拷贝属性

}

@end

 

main.m

#import <Foundation/Foundation.h>

#import “TRStudent.h”

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        TRStudent* p=[[TRStudent alloc]init];

         p.i=10;

        TRStudent *p2=p;//浅拷贝  指向的地址同样

        TRStudent *p3=[p copy];//深拷贝,指向的地址不平等

         NSLog(@”p:%p”,p);

         NSLog(@”p2:%p”,p2);

         NSLog(@”p3:%p %d”,p3,p3.i);//深拷贝属性

    }

    return 0;

}

结果:

load

initialize

p:0x100601a80

p2:0x100601a80

p3:0x100600650 10

 

 
4.copy还是能够用在注明式属性中,不过注意程序的本色爆发变动,会自动向实例变量发送copy信息,实例变量必需遵守公约/完结

TRBook.h

#import <Foundation/Foundation.h>

 

@interface TRBook : NSObject<NSCopying>

@property(nonatomic,assign)int price;

@end

TRBook.m

#import “TRBook.h”

 

@implementation TRBook

 

-(id)initWithPrice:(int)price{

    self = [super init];

    if (self) {

        self.price = price;

    }

    return self;

}

– (id)copyWithZone:(NSZone *)zone{

    return [[TRBook alloc]initWithPrice:self.price];

}

@end

TRStudent.h

#import <Foundation/Foundation.h>

#import “TRBook.h”

@interface TRStudent : NSObject

//@property(retain)TRBook *book;

@property(copy)TRBook *book;

-(void)study;

 

@end

TRStudent.m

#import “TRStudent.h”

 

@implementation TRStudent

-(void)study{

    NSLog(@”学生看书 price:%d add:%p”,self.book.price,self.book);

}

 

@end

main.m

TRBook *sanguo = [[TRBook alloc]init];

        sanguo.price = 10;

        NSLog(@”sanguo:%p”,sanguo);

        TRStudent *stu = [[TRStudent alloc]init];

        stu.book = sanguo;

        [stu study];

结果:

sanguo:0x100203af0

学员看书 price:10 add:0x1004006a0

 

二、类对象

1.类的目的:关注的是类的代码消息,须要相比类的多少的时候须要接纳类的靶子。

2.类对象:关怀的是目的的数目新闻,须要比较类的代码的时候必要使用类对象。

3.比较类音信

一、向类发送class音讯,能够创建类对象。  

             Class  class  =  [TRStudent  class];

二、判断

      1.推断一个引用指向的对象是还是不是是某种类型或子类型

– (BOOL)isKindOfClass:(Class)c;  

TRAnimal.h

#import <Foundation/Foundation.h>

 

@interface TRAnimal : NSObject

-(void)eat;

@end

TRAnimal.m

#import “TRAnimal.h”

 

@implementation TRAnimal

-(void)eat{

    NSLog(@”动物具有吃的技艺”);

}

@end

TRDog.h

#import “TRAnimal.h”

 

@interface TRDog : TRAnimal//继承了TRAnimal

 

@end

TRDog.m

TRPerson.h

#import <Foundation/Foundation.h>

 

@interface TRPerson : NSObject//没有继续了TRAnimal

 

@end

TRPerson.m

main.m

#import <Foundation/Foundation.h>

#import “TRAnimal.h”

#import “TRDog.h”

#import “TRPerson.h”

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        TRAnimal *animal = [[TRDog alloc]init];

        TRAnimal *animal2 = [[TRPerson alloc]init];

        Class c = [TRAnimal class];//向类发送class新闻,能够创立类对象

               TRAnimal *animals[2] = {animal,animal2};

        for (int i = 0; i<2; i++) {

            //决断贰个对象 是或不是是某连串项目

            if ([animals[i] isKindOfClass:c]) {

                 [animals[i] eat];

            }

        }

        

    }

    return 0;

}

结果:

动物具备吃的力量

 

     2.论断二个援引(实例)指向的对象是不是是某类别型

-(BOOL)isMemberOfClass:(Class)c; 

    3.相比“类”音信的时候,须求使用类对象,推断贰个类是不是是另多个类的子类

+(BOOL)isSubclassOfClass:(Class)c; 

main.m

@autoreleasepool {

        TRAnimal *animal = [[TRDog alloc]init];

        TRAnimal *animal2 = nil;

        Class c = [TRAnimal class];

        //判断TRPerson是否是TRAnimal的子类

        //健壮性

        

        if ([TRPerson isSubclassOfClass:c]) {

            NSLog(@”TRPerson是TRAnimal的子类,能够使用多态”);

            animal2 = [[TRPerson alloc]init];

        }else{

            NSLog(@”TRPerson不是TRAnimal的子类,不能运用多态”);

        }

        

    }

结果:

TRPerson不是TRAnimal的子类,不得以选用多态

4.情势采取器

   1.足以博得一个办法的援用。

SEL sel = @selector(study)//方法名

   2.急需看清类中是不是有有些方法

BOOL  b  =  [TRStudent
instancesRespondToSelector:@selector(study)];

   3. 能够向目的发送任何音信,而无需在编写翻译的时候申明

[stu performSelector:sel];

例:

TRAnimal.h

#import <Foundation/Foundation.h>

 

@interface TRAnimal : NSObject

-(void)eat;

@end

TRAnimal.m

#import “TRAnimal.h”

 

@implementation TRAnimal

-(void)eat{

    NSLog(@”nihao”);

}

@end

main.m

#import <Foundation/Foundation.h>

#import “TRAnimal.h”

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        TRAnimal *animal = [[TRAnimal alloc]init];

        //代表八个艺术

        SEL sel = @selector(eat);

        //决断四个类是不是足以响应有些音讯

        //判定三个类是还是不是有某些方法

        BOOL isRespond = [TRAnimal instancesRespondToSelector:sel];

        if (isRespond) {

            NSLog(@”类中有eat音讯,能够发送”);

            //[animal eat];

        }else{

            NSLog(@”类中绝非eat音讯,不得以发送”);

        }

        

        [animal performSelector:sel];

        

    }

    return 0;

}

结果:

类中有eat音讯,能够发送

nihao

5.公约选拔器

   1.协商的援用指向多少个磋商

Prtocol*  p  =  @protocol(NSCopying);  

  2.足以确定四个类是不是遵从了有个别左券

BOOL  b  =  [TRStudent  conformsToProtocol:p];  

#import <Foundation/Foundation.h>

#import “TRProtocol.h”

#import “TRMyclass.h”

#import “TRStudent.h”

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

//        id<TRProtocol> p1=[[TRStudent alloc]init];

//        [p1 eat];

       
Protocol*[email protected](TRProtocol);//协议名

        if ([TRStudent conformsToProtocol:p]) {

            NSLog(@”遵从了商业事务”);

        }

        else{

            NSLog(@”未有服从左券”);

        }

           }

    return 0;

}

结果:

坚守了左券

=======================================================================

知识点

二、NSString

一、不可变字符串(NSString)

在新创造对象的根基上改造,就是又复制了一份

        //制造字符串

        NSString *str = @”hello”;

        NSString *str2 = @”hello”;

        NSLog(@”str addr:%p”,str);

        NSLog(@”str2 addr:%p”,str2);

 

        //将C语言中的字符串 转变来OC的字符串

        NSString *str3 = [[NSString alloc]initWithCString:”hello”];

        NSLog(@”str3 addr:%p”,str3);

        NSString *str4 = [[NSString alloc]initWithString:@”hello”];

        NSLog(@”str4 addr:%p”,str4);

        //printf(“%sworld”,”Hello”);

        NSString *str5 = [[NSString
alloc]initWithFormat:@”%@”,@”hello”];

结果:

str addr:0x100002060

str2 addr:0x100002060

str3 addr:0x100200d00

str4 addr:0x100002060

str5 addr:0x10010cd80

 

1.NSString的截取

#import <Foundation/Foundation.h>

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        NSString *
[email protected]”HelloWord”;

        NSString*p2=[p
substringToIndex:5];//取头(从头到哪),to不包括下标内容

        NSString*p3=[p
substringFromIndex:5];//去尾(从哪到尾),from饱含下标内容

        NSLog(@”p2:%@ p3:%@”,p2,p3);

        NSRange r={4,3};//取中间,从哪长度是稍稍

        NSString*p4=[p substringWithRange:r];

         NSLog(@”p4:%@”,p4);

    }

    return 0;

}

结果:

p2:Hello p3:Word

p4:oWo

 

练习:

//练习:230119197007010000

        //求:年、月、日

        //截取获得日期

        NSString *sid = @”230119197007010000″;

        //在OC个中 成立布局有更轻易的主意

        //会有协会体函数化解那个主题素材

        //NSMakeRange

        NSRange range2 = NSMakeRange(6, 8);

        NSString *date = [sid substringWithRange:range2];

        NSLog(@”date:%@”,date);

        NSString *year = [date substringToIndex:4];

        NSLog(@”year:%@”,year);

        NSString *month = [date substringWithRange:NSMakeRange(4,
2)];

        NSLog(@”month:%@”,month);

        NSString *day = [date substringFromIndex:6];

        NSLog(@”day:%@”,day);

date:19700701

year:1970

month:07

day:01

 

2.字符串的拼凑(伊始化、追加、追加钦命范围)

//字符串的拼凑

        NSString *str10 = @”Hello”;

        //追加

        NSString *str11 = [str10 stringByAppendingString:@”World”];

        NSLog(@”str11:%@”,str11);

        //初始化

        NSString *str12 = @”Hello”;

        NSString *str13 = @”World”;

        NSString *str14 = [NSString
stringWithFormat:@”%@%@”,str12,str13];

        NSString *str15 = [NSString
stringWithFormat:@”Hello%@”,str13];

        NSLog(@”str14:%@”,str14);

        NSLog(@”str15:%@”,str15);

        //按钦点格式(范围)追加内容

        NSString *str16 = @”Hello”;

        NSString *str17 = [str16
stringByAppendingFormat:@”%@%@”,@”World”,@”123″];

        NSLog(@”str17:%@”,str17);

结果:

str11:HelloWorld

str14:HelloWorld

str15:HelloWorld

str17:HelloWorld123  

 

3.字符串替换    

    //替换

        NSString *str18 = @”www.tarena.com.cn”;

        NSString *str19 = [str18
stringByReplacingCharactersInRange:NSMakeRange(4, 6)
withString:@”163″];

        NSLog(@”str19:%@”,str19);

结果:

str19:www.163.com.cn  

 

4.字符串的编码集

经过文件内容创造字符串,注意留存编码集的主题材料,默认为ASC(不分包中文),要钦命相应的普通话编码集(GBK简体粤语、
GB2312简体普通话、BIG5繁体中文、UTF8满世界主流语言…)

参数1  文件的门道      

参数2  内定文件的编码集    

参数3  出现非凡管理

        //编码集

        //参数 文件的门路 不富含文件名

        NSString *path = @”/Users/tarena/Desktop”;

        //path = [path stringByAppendingString:@”/test.txt”];

        path = [path stringByAppendingString:@”/test2.rtf”];

        //把文件中的内容 读取到字符串中

        //NSString *str20 = [[NSString
alloc]initWithContentsOfFile:path];

        NSString *str21 = [[NSString
alloc]initWithContentsOfFile:path encoding:NSUTF8 StringEncoding
error:nil];

        NSLog(@”str21:%@”,str21);

5.字符串相比较

 

BOOL b=[str isEqualToString:stu2]//stu和stu2相比较,相比较的是字符串的原委

注:==只可以够相比五个字符串的地点

main.m

@autoreleasepool {

        NSString*
[email protected]”fcp”;

         NSString*
[email protected]”fcp”;

        

       
NSString*[email protected]”123″;

       
NSString*[email protected]”123″;

        if ([use isEqualToString:use1]&&[password
isEqualToString:password1]) {

            NSLog(@”登入成功”);

        }

        else{

            NSLog(@”登录失利”);

        }

        

    }

结果:登录战败

 

二、可变字符串(NSMutableString)

是NSString的子类,NSString的作用都承继,对字符串的退换是在原字符串的基本功上

c语言对象(数据)退换   CRUD 创设 查看 修改 删除

oc数据变动   增多 删除 替换

                                                                      
                                                                       
                                                                       
                                                                       
                   
1.可变字符串的开创

//字符串的创建

        //在可变字符串中 空字符串就有意义

        NSMutableString *mString = [[NSMutableString alloc]init];

        //可变字符串不能够与代码区的字符串赋值使用

        //NSMutableString *mString2 = @”Hello”;mString2将退化成NSString

        //能够内定字符串的半空中山大学小 创造字符串

        NSMutableString *mString3 =[NSMutableString
stringWithCapacity:30];

2.加多内容(插入)

参数1:增加的剧情

参数2:替换的长短

//可变字符串 增加内容

        NSMutableString *mString4 = [[NSMutableString
alloc]initWithString:@”Hello”];

        [mString4 appendString:@”World”];//给mString4拼接

        NSLog(@”mString4:%@”,mString4);

        //能够在钦点地方 加多字符串内容

        [mString4 insertString:@”123″ atIndex:5];

        NSLog(@”mString4:%@”,mString4);

结果:

mString4:HelloWorld

mString4:Hello123World

 

3.删减内容

//删除内容

        NSMutableString *mString5 = [[NSMutableString
alloc]initWithString:@”I am learning Objective-C language.”];

        //查找字符串内容,在所在字符串中的地方

        NSRange range = [mString5
rangeOfString:@”learn”];//供给删除的剧情

        NSLog(@”range: loc:%lu length:%lu”,range.location,range.length);

        //删除可变字符串中钦定的剧情

        [mString5 deleteCharactersInRange:range];

        NSLog(@”mString5:%@”,mString5);

结果:

range: loc:5 length:5

mString5:I am ing Objective-C language.

 

3.交替内容

参数1:(位置,长度)

参数2:替换内容

//替换内容

        NSMutableString *mString6 = [[NSMutableString
alloc]initWithString:@”HelloWorld!”];

        [mString6 replaceCharactersInRange:NSMakeRange(4, 3)
withString:@”1234″];

        NSLog(@”mString6:%@”,mString6);

结果:

mString6:Hell1234rld!

======================================================================================

知识点

三、类型转换(NSNumber

 

在广大类使用的时候,如若选择数值,就须要将数值转换来对象类型

1.int类型的转变

 

   1.封装方法

     +  (NSNumber  *)numberWithInt:(int)value;   

     +  (NSNumber  *)numberWithUnsignedInt:(unsigned   int)value;

   2.拆封方式

     –  (int)intValue;  

     –  (unsigned  int)unsignedIntValue;

例:

#import <Foundation/Foundation.h>

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        

        int i=10;

        //封装 将主导数据类型封装成数值对象类型

        NSNumber* number=[NSNumber numberWithInt:i];

        NSLog(@”%@”,number);

        //拆封

        int i2=[number intValue];

        NSLog(@”%d”,i2);

    }

    return 0;

}

结果:

10

10

2.chan类型转变

  1.封装方法

     +  (NSNumber  *)numberWithChar:(char)value;   

     +  (NSNumber  *)numberWithUnsignedChar:(unsigned  char)value;

   2.拆封形式

     –  (char)charValue;  

     –  (unsigned  char)unsignedCharValue;

3.float类型转变

4.double类型转换

 

5.BOOL类型转变

   1.封装方法

     +  (NSNumber  *)numberWithBool:(BOOL)value;  

   2.拆封格局

     –  (BOOL)boolValue;

========================================================================

知识点

四、NSValue

1.有的时候候需求创立八个对象,以细致反应原始数据类型或然数
据结构,这种景况就必要利用NSValue类,它能够将其他C中有效的变量类型封装成对象类型。  

  1. NSNumber是NSValue的子类  

1.将自定义类型调换

由此NSValue类,将组织类型封装成NSValue对象   

参数1  结构体变量的内部存款和储蓄器地址   

参数2  内存地址对应的结构体类型

#import <Foundation/Foundation.h>

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        

        

        //定义一个布局体类型

        typedef struct{

            int x;

            int y;

        }TRPoint;

        //c语言中自动义数据类型 声爱他美(Aptamil)个构造变量何况赋值

        TRPoint point={6,5};

 

        //封装成OC语言中的对象类型

        //通过NSValue类,将协会类型封装成NSValue对象

        NSValue* value=[NSValue valueWithBytes:&point
objCType:@encode(TRPoint)];

        //解封                                                         
                          参数1                                参数2

        TRPoint point2;

        [value getValue:&point2];

        NSLog(@”x:%d y:%d”,point2.x,point2.y);

    }

    return 0;

}

结果:x:6 y:5

=====================================================================================================================================

知识点

五、NSDate(日期)

NSDate存储的是岁月音信,私下认可存款和储蓄的是世界标准时间
(UTC),输出时索要基于时区转变为本土时间。中夏族民共和国次大陆、香岛、帕罗奥图、安徽…的时刻增均与UTC时间差为+8,也正是 UTC+8

//日期

        NSDate* date=[[NSDate alloc]init];//获得当前时光

        NSLog(@”%@”,date);

        NSDate* date2=[NSDate
dateWithTimeIntervalSinceNow:30];//和当下比延迟30秒

        NSDate* date3=[NSDate
dateWithTimeIntervalSinceNow:-60*60*24];//昨天

        NSDate* date4=[NSDate
dateWithTimeIntervalSinceNow:60*60*24];//明天

        NSLog(@”%@”,date2);

        NSLog(@”%@ %@”,date3,date4);

结果:

2015-01-26 08:26:34 +0000今天

2015-01-26 08:27:04 +0000

2015-01-25 08:26:34 +0000昨天

2015-01-27 08:26:34 +0000明天

=====================================================================================================================================

知识点

六、NSDateFormatter

选择它能够钦赐所需的别的类型的一言一行,
并将钦定的NSDate对象转变来与所需行为非凡的日期 的呼应字符串表示

//调换时间模板

        NSDateFormatter*dateFormatter=[[NSDateFormatter
alloc]init];

        //hh12小时制mm分钟ss秒 HH24小时制 //MM月dd日yyyy年

       
[email protected]”yyyy-MM-dd
hh:mm:ss”;

        //时间对象的转移

        NSDate* date=[[NSDate alloc]init];

        NSString*strDate=[dateFormatter stringFromDate:date];

        NSLog(@”%@”,strDate);

结果:

2015-01-26 04:48:30

 

练习:年龄 = 当前时刻 – 出生年

     根据居民身份证号 获得一人的年龄

     230110197007010000

 

#import <Foundation/Foundation.h>

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        NSDate *now = [NSDate date];

        //成立时间模板对象

        NSDateFormatter *formatter = [[NSDateFormatter alloc]init];

        //内定模板格式

        //yyyy MM dd hh mm ss 年月日时分秒

        //formatter.dateFormat = @”hh小时mm分钟ss秒 yyyy-MM-dd”;

        formatter.dateFormat = @”yyyy”;

        //调换时间 按钦命格式转换时间 转换本地时间

        NSString *strDate = [formatter stringFromDate:now];

        NSLog(@”strDate:%@”,strDate);

        //练习:年龄 = 当前时光 – 出生年

        //根据身份ID号 获得一人的年华

        //230110197007010000

        NSString *sid = @”230119199907010000″;

        //在OC个中 创造布局有更简明的艺术

        //会有协会体函数消除那么些题目

        //NSMakeRange

        NSRange range2 = NSMakeRange(6, 8);

        NSString *date = [sid substringWithRange:range2];

        NSLog(@”date:%@”,date);

        NSString *year = [date substringToIndex:4];

        

        int nowDate = [strDate intValue];

        int idDate = [year intValue];

        int yearsOld = nowDate-idDate;

        NSLog(@”age:%d”,yearsOld);

        

    }

    return 0;

}

结果:

strDate:2015

date:19990701

age:16

====================================================================================================================================

知识点

七、集合类(Collections

一.NSSet

   1.是三个冬日的,管理多少个目的的集结类,最大特征
是会合中不允许出现重复对象,和数学上的集结含义是一 样的

    2.除了无序、不许重复之外,其余功效和NSArray是一样的

二.NSArray

   1.数组是一组有序的汇聚,

   2.经过索引下标取到数组中的各类要素,与字符串一样,

   3.数组也是有可变数组 (NSMutableArray)和不可变数组(NSArray),

   4.数组中不能保留基本数据类型、结构体数据类型,须求利用
NSNumber和NSValue实行数据“封装

 1.NSArray的创建(4种)

    1.惯常字符串数组

           NSString*
[email protected]”one”;

        NSString*
[email protected]”two”;

        NSString*
[email protected]”three”;

        NSArray* array1=[[NSArray
alloc]initWithObjects:str1,@”two”,str3,nil];//保存的都以地方

        NSLog(@”%@”,array1);

结果:

(

    one,

    two,

    three

)

   2.数组值是目的

**万一急需输出对象时,输出对象的属性值,要和煦重写description方法 

TRMyClass.h

#import <Foundation/Foundation.h>

 

@interface TRMyClass : NSObject

@property(nonatomic,assign)int i;

@property(nonatomic,copy)NSString *str;

@end

TRMyClass.m

#import “TRMyClass.h”

 

@implementation TRMyClass

//要团结重写description方法

-(NSString *)description{

    return [NSString stringWithFormat:@”i:%d str:%@”,self.i,self.str];

}

@end

main.m

        NSString *str1 = @”one”;

        TRMyClass *myClass = [[TRMyClass alloc]init];

        myClass.i = 10;

        myClass.str = @”ABC”;

        NSLog(@”myClass:%@”,myClass);

       
//即使须要输出对象时,输出对象的属性值,要团结重写description方法

        NSString *str2 = @”two”;

        NSString *str3 = @”three”;

        //int array[3] = {1,2,3};

        NSArray *array2 = [[NSArray
alloc]initWithObjects:@”one”,str2,str3,myClass, nil];

        NSLog(@”array2:%@”,array2);

结果:

array2:(

    one,

    two,

    three,

    “i:10 str:ABC”

)

   3.经过四个以局地数组 创造二个新的数组

   //通过二个以部分数组 创立三个新的数组

        NSArray *array3 = [[NSArray
alloc]initWithArray:array2];array2是上边的数组

        NSLog(@”array3:%@”,array3);

结果:同上

   4.二维数组

       //数组中的成分还足以是指标(数组本人也是指标)

        //二维数组

        NSArray *array4 = [NSArray arrayWithObject:array2];

结果:同上

 5.数组添澳元素,成分为数组

NSArray *array = @[@”one”,@”two”,@”three”];

        //@1->[NSNumber numberWithInt:1]

        //@基本数据类型->引用类型

        NSArray *array2 = @[@’c’,@2,@3,@YES];

        //加多”三个”数组元素

        NSArray *array3 = [array arrayByAddingObject:array2];

        NSLog(@”array3:%@”,array3);

        //添加”一组”元素

        NSArray *array4 = [array
arrayByAddingObjectsFromArray:array2];

        NSLog(@”array4:%@”,array4);

结果:

array3:(   用作贰个因素

    one,

    two,

    three,

        (

        99,

        2,

        3,

        1

    )

)

array4:(  改为当中二个对象

    one,

    two,

    three,

    99,

    2,

    3,

    1

)

 2.数组的遍历

//数组的遍历

        //array2.count == [array2 count]求数组的尺寸    
array2是上边包车型客车数组

        for (int i = 0; i<[array2 count]; i++) {

            //array[]

            if (i==2) {

                continue;

            }

            id obj = [array2 objectAtIndex:i];//通过下标获得数组

            NSLog(@”obj:%@”,obj);

        }

结果:

obj:one

obj:two

obj:i:10 str:ABC

**3.OC中遍历数组形式

 a、c语言中的遍历格局

 b、飞快枚举OC

   参数1:每一趟获得数组申月素的援用 

   参数2:哪多个集合/组合(数组引用对象)

 c、迭代器遍历OC

  能够得到数组或集结相应的取代器

#import <Foundation/Foundation.h>

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        NSArray *array = [NSArray
arrayWithObjects:@”one”,@”two”,@”three”, nil];

        //1.C语言中的遍历情势

        for (int i = 0; i<[array count]; i++) {

            NSLog(@”array[%d]:%@”,i,[array objectAtIndex:i]);

        }

 

        //2.***高效枚举

        //参数1 每便得到数组巧月素的援用

        //参数2 哪几个会合/组合

        for (NSString *str in array) {

            NSLog(@”str:%@”,str);

        }

 

        //3.迭代器遍历

        //能够拿走数组或集合相应的取代器

        NSEnumerator *enumertator = [array objectEnumerator];

        //获得迭代器指向的内部存款和储蓄器空间的援引

        //并且会活动向下活动一人,当不唯有数组或集结的界定则赶回nil值

        //[enumertator nextObject];

        NSString *str = nil;

        while (str = [enumertator nextObject]) {

            NSLog(@”str2:%@”,str);

        }

        //重构 学生与全校的故事

        

    }

    return 0;

}

str:one

str:two

str:three

 

练习:

这个学校和学员的轶事

依赖标准 筛选

#import <Foundation/Foundation.h>

#import “TRStudent.h”

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        //学生

        TRStudent *stu1 = [TRStudent studentWithAge:18
andName:@”zhangsan”];

        TRStudent *stu2 = [TRStudent studentWithAge:22
andName:@”li”];

        TRStudent *stu3 = [TRStudent studentWithAge:19
andName:@”zhaoliu”];

        TRStudent *stu4 = [TRStudent studentWithAge:19
andName:@”wangwu”];

        TRStudent *stu5 = [TRStudent studentWithAge:20
andName:@”qianqi”];

        TRStudent *stu6 = [TRStudent studentWithAge:21
andName:@”guanyu”];

        TRStudent *stu7 = [TRStudent studentWithAge:20
andName:@”zhangfei”];

        TRStudent *stu8 = [TRStudent studentWithAge:18
andName:@”liubei”];

        //创立班级

        NSArray *class1412A = [NSArray arrayWithObjects:stu1,stu2,
nil];

        NSArray *class1412B = [NSArray arrayWithObjects:stu3,stu4,
nil];

        NSArray *class1412C = [NSArray arrayWithObjects:stu5,stu6,
nil];

        NSArray *class1412D = [NSArray arrayWithObjects:stu7,stu8,
nil];

        //学院

        NSArray *college3G = [NSArray
arrayWithObjects:class1412A,class1412B, nil];

        NSArray *collegeTest = [NSArray
arrayWithObjects:class1412C,class1412D, nil];

        //学校

        NSArray *universityTarena = [NSArray
arrayWithObjects:college3G,collegeTest, nil];

        NSLog(@”universityTarena:%@”,universityTarena);

        

        //遍历

        //学校

        for (int i = 0; i<[universityTarena count]; i++) {

            NSArray *college =[universityTarena objectAtIndex:i];

            //学院

            for (int j = 0; j<[college count]; j++) {

                NSArray *class = [college objectAtIndex:j];

                //班级

                for (int k = 0; k<[class count]; k++) {

                    TRStudent *stu = [class objectAtIndex:k];

                    //依据法则实行输出筛选

                    //依据年龄进行筛选等于18

                    if ([stu.name isEqualToString:@”zhangsan”]) {

                        NSLog(@”stu name:%@ age:%d”,stu.name,stu.age);

                    }

                }

            }

        }

        

        

    }

    return 0;

}

结果:

universityTarena:(

        (

                (

            “age:18 name:zhangsan”,

            “age:22 name:li”

        ),

                (

            “age:19 name:zhaoliu”,

            “age:19 name:wangwu”

        )

    ),

        (

                (

            “age:20 name:qianqi”,

            “age:21 name:guanyu”

        ),

                (

            “age:20 name:zhangfei”,

            “age:18 name:liubei”

        )

    )

)

stu name:zhangsan age:18

 

**oc中数组遍历嵌套

//迭代器

        NSEnumerator *enumerator=[university objectEnumerator];

        NSArray *str=nil;

        while (str=[enumerator nextObject]) {

            //学院

            NSEnumerator *enumerator1=[str objectEnumerator];

            NSArray *str2=nil;

            while (str2=[enumerator1 nextObject]) {

                //班级

                NSEnumerator *enumerator2=[str2 objectEnumerator];

                TRStudent *str3=nil;

                while (str3=[enumerator2 nextObject]) {

                    NSLog(@”%@”,str3);

                }

            }

        }

=====================================================================

//枚举遍历

        for (NSArray* stu11 in university) {

       

            for (NSArray* stu22 in stu11) {

                //NSArray*class=stu22;

                for (TRStudent* stu33 in stu22) {

                    NSLog(@”%@”,stu33);

                }

            }

        }

======================================================================================

***异常的快枚举与迭代器在进行的进度中不能够直接删除成分,需求把成分先保存起来,需等到枚举截至,才得以去除

        TRStudent *s=nil;

        for ( TRStudent* a in class) {

            if ([a.name isEqualToString:@”lisi”]) {

                s=a;

                //[class removeObject:a];不能间接在枚举中剔除

                NSLog(@”%@”,a);

           }

        }

          [class removeObject:s];

          NSLog(@”%@”,class);

**当数组中有八个要素重复,使用此格局

 NSMutableArray *removeStrs = [NSMutableArray array];

        for (NSString *str in array) {

            if ([str isEqualToString:@”two”]) {

                //一时保存要刨除的剧情

                [removeStrs addObject:str];

            }

            NSLog(@”str:%@”,str);

        }

        //[array removeObject:removeStr];

        for (NSString *removeStr in removeStrs) {

            [array removeObject:removeStr];

        }

        NSLog(@”array:%@”,array);

 

 3.查询有些对象在数组中的地点

        //重返数组中最后贰个目的

        id lastObj = [array2 lastObject];

        NSLog(@”lastObj:%@”,lastObj);

        //查询某些对象在数组中的地点

        NSUInteger index = [array2
indexOfObject:str3];array2是上面包车型大巴数组

        NSLog(@”index:%lu”,index);

        //通过下标得到数组

        NSString* objStr=[array1 objectAtIndex:0];

        //求数老董度

        NSUInteger l=[stus count];

        NSLog(@”%lu”,(unsigned long)l);

结果:

lastObj:i:10 str:ABC

index:2

 

练习:

明日有一对数额,它们是整型数据10、字符型数据
‘a’、单精度浮点型数据10.1f和自定义类TPRADOStudent的叁个目的,将它们寄放在数组NSArray中

TRStudent.h

TRStudent.m

main.m

#import <Foundation/Foundation.h>

#import “TRStudent.h”

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        //调换到数值对象

        NSNumber* num1=[NSNumber numberWithInt:10];

        NSNumber* num2=[NSNumber numberWithChar:’a’];

        NSNumber* num3=[NSNumber numberWithFloat:10.1f];

        NSLog(@”%@ %@ %@”,num1,num2,num3);

        TRStudent* stu=[[TRStudent alloc]init];

 

        //遍历数组

        NSArray* array=[[NSArray
alloc]initWithObjects:num1,num2,num3,stu, nil];

        for (int i=0; i<[array count]; i++) {

            id job=[array objectAtIndex:i];

            NSLog(@”%@”,job);

        }

    }

    return 0;

}

 

三、Ordered(数组排序)

  1.排序法则本质(系统暗中认可升序,如需降序,在NSOrderedAscending前加个减号)

’NSString *str = @”aad”;

        NSString *str2 = @”aac”;

        NSComparisonResult cr = [str compare:str2];

        switch (cr) {

            case NSOrderedAscending:

                NSLog(@”str<str2″);

                break;

            case NSOrderedSame:

                NSLog(@”str=str2″);

                break;

            case NSOrderedDescending:

                NSLog(@”str>str2″);

                break;

        }

结果:str>str2

 2.排序法则

NSString *str11 = @”1″;

        NSString *str12 = @”5″;

        NSString *str13 = @”3″;

        NSArray *array = [NSArray arrayWithObjects:str11,str12,str13,
nil];

        NSLog(@”array:%@”,array);

        //排序法则

        SEL cmp = @selector(compare:);

        //获得排好序的新数组

        NSArray *array2 = [array                                      
                                                                       
                        结果:

array:(       

    1,

    5,

    3   

)

array2:(

    1,

    3,

    5

)

练习1:向数组中放入数字8 3 2 1 5 实行排序

        NSNumber *num1 = [NSNumber numberWithInt:8];

        NSNumber *num2 = [NSNumber numberWithInt:3];

        NSNumber *num3 = [NSNumber numberWithInt:2];

        NSNumber *num4 = [NSNumber numberWithInt:1];

        NSNumber *num5 = [NSNumber numberWithInt:5];

        NSArray *array3 = [NSArray
arrayWithObjects:num1,num2,num3,num4,num5, nil];

        NSLog(@”array3:%@”,array3);

        NSArray *array4 = [array3
sortedArrayUsingSelector:@selector(compare:)];

        NSLog(@”array4:%@”,array4);

结果:

array4:(

    1,

    2,

    3,

    5,

    8

)

练习2:制造三个自定义类TWranglerStudent,为此类生成多少个对象。
把那四个对象存入贰个数组在这之中,然后根据姓名、年龄对四个对象 举行排序。

TRStudent.h

#import <Foundation/Foundation.h>

 

@interface TRStudent : NSObject

@property(nonatomic,assign)int age;

@property(nonatomic,copy)NSString *name;

-(id)initWithAge:(int)age andName:(NSString*)name;

+(TRStudent*)studentWithAge:(int)age andName:(NSString*)name;

//排序法规

//相比年龄

-(NSComparisonResult)compare:(TRStudent*)otherStudent;

//相比姓名

-(NSComparisonResult)compareName:(TRStudent *)otherStudent;

//先年龄后姓名

-(NSComparisonResult)compareAgeAndName:(TRStudent *)otherStudent;

@end

TRStudent.m

#import “TRStudent.h”

 

@implementation TRStudent

-(id)initWithAge:(int)age andName:(NSString*)name{

    self = [super init];

    if (self) {

        self.age = age;

        self.name = name;

    }

    return self;

}

+(TRStudent*)studentWithAge:(int)age andName:(NSString*)name{

    return [[TRStudent alloc]initWithAge:age andName:name];

}

-(NSString *)description{

    return [NSString stringWithFormat:@”age:%d
name:%@”,self.age,self.name];

}

//制订年龄的相比法规

//按姓名相比?

//要是年龄同样再按姓名相比较?

//假使姓名同样再按年龄比较?

-(NSComparisonResult)compare:(TRStudent*)otherStudent{

    if(self.age>otherStudent.age){

        return NSOrderedDescending;

    }else if (self.age == otherStudent.age){

        return NSOrderedSame;

    }else{

        return NSOrderedAscending;

    }

}

-(NSComparisonResult)compareName:(TRStudent *)otherStudent{

    return [self.name compare:otherStudent.name];

}

-(NSComparisonResult)compareAgeAndName:(TRStudent *)otherStudent{

    //先比较年龄

    if(self.age>otherStudent.age){

        return NSOrderedDescending;

    }else if (self.age == otherStudent.age){

        //比较姓名

        return [self.name compare:otherStudent.name];

    }else{

        return NSOrderedAscending;

    }

}

@end

main.m

#import <Foundation/Foundation.h>

#import “TRStudent.h”

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        TRStudent *stu1 = [TRStudent studentWithAge:18
andName:@”zhangsan”];

        TRStudent *stu2 = [TRStudent studentWithAge:22
andName:@”li”];

        TRStudent *stu3 = [TRStudent studentWithAge:19
andName:@”zhaoliu”];

        TRStudent *stu4 = [TRStudent studentWithAge:19
andName:@”wangwu”];

        TRStudent *stu5 = [TRStudent studentWithAge:20
andName:@”qianqi”];

        NSArray *stus = [NSArray
arrayWithObjects:stu1,stu2,stu3,stu4,stu5, nil];

        NSLog(@”stus:%@”,stus);

 

        NSArray *stus2 = [stus
sortedArrayUsingSelector:@selector(compare:)];

        NSLog(@”stu2:%@”,stus2);

 

        NSArray *stus3 = [stus
sortedArrayUsingSelector:@selector(compareName:)];

        NSLog(@”stu3:%@”,stus3);

 

        NSArray *stus4 = [stus
sortedArrayUsingSelector:@selector(compareAgeAndName:)];

        NSLog(@”stu4:%@”,stus4);

    }

    return 0;

}

结果:

stu4:(

    “age:18 name:zhangsan”,

    “age:19 name:wangwu”,

    “age:19 name:zhaoliu”,

    “age:20 name:qianqi”,

    “age:22 name:li”

四、数组的正片

– 数组的复制分为:  

  1.深正片(内容复制):将目标生成别本  

  2.浅拷贝(援用复制):仅将目的的援用计数加1   

– 数组中的成分,对象的引用

TRStudent.h

#import <Foundation/Foundation.h>

 

@interface TRStudent : NSObject<NSCopying>

@property(nonatomic,assign)int age;

@property(nonatomic,copy)NSString*name;

-(id)initWithAge:(int)age andName:(NSString*)name;

+(TRStudent*)studentWithAge:(int)age andName:(NSString*)name;

@end

 

TRStudent.m

#import “TRStudent.h”

 

@implementation TRStudent

-(id)initWithAge:(int)age andName:(NSString*)name{

    if ([super init]) {

        self.age=age;

        self.name=name;

    }

    return self;

}

+(TRStudent*)studentWithAge:(int)age andName:(NSString*)name{

    return [[TRStudent alloc]initWithAge:age andName:name];

}

 

//重写description方法,消除再次来到数值难题

/*

-(NSString *)description{

    return [NSString stringWithFormat:@”age:%d
name:%@”,self.age,self.name];

}

 */

 

//遵守cope协议

-(id)copyWithZone:(NSZone *)zone{

    return [[TRStudent alloc]initWithAge:self.age
andName:self.name];

}

@end

 

main.m

#import <Foundation/Foundation.h>

#import “TRStudent.h”

int main(int argc, const char * argv[])

{

    @autoreleasepool {

        TRStudent *stu1 = [TRStudent studentWithAge:18
andName:@”zhangsan”];

        TRStudent *stu2 = [TRStudent studentWithAge:22
andName:@”li”];

        TRStudent *stu3 = [TRStudent studentWithAge:19
andName:@”zhaoliu”];

        TRStudent *stu4 = [TRStudent studentWithAge:19
andName:@”wangwu”];

        TRStudent *stu5 = [TRStudent studentWithAge:20
andName:@”qianqi”];

        NSArray *stus = [NSArray
arrayWithObjects:stu1,stu2,stu3,stu4,stu5, nil];

        NSLog(@”stus:%@”,stus);

        //浅拷贝 NO

        /*

        TRStudent *stu = [[TRStudent alloc]init];

        TRStudent *stu2 = stu;

        */

        NSArray *stus2 = [[NSArray alloc]initWithArray:stus
copyItems:NO];//浅拷贝

        NSLog(@”stus2:%@”,stus2);

        //深拷贝 YES

        //数组的深拷贝要依据于对象的深拷贝

        //对象的深拷贝(1.NSCopying 2.copyWithZone)(须求服从copy合同)

        NSArray *stus3 = [[NSArray alloc]initWithArray:stus
copyItems:YES];

        NSLog(@”stus3:%@”,stus3);

    }

    return 0;

}

结果:

(

    “<TRStudent: 0x10010abc0>”,

    “<TRStudent: 0x1001099f0>”,

    “<TRStudent: 0x100109c40>”,

    “<TRStudent: 0x10010b350>”,

    “<TRStudent: 0x100109e70>”

)

(

    “<TRStudent: 0x10010abc0>”,

    “<TRStudent: 0x1001099f0>”,

    “<TRStudent: 0x100109c40>”,

    “<TRStudent: 0x10010b350>”,

    “<TRStudent: 0x100109e70>”

)

 (

    “<TRStudent: 0x100500d60>”,

    “<TRStudent: 0x1005004b0>”,

    “<TRStudent: 0x1005004d0>”,

    “<TRStudent: 0x1005004f0>”,

    “<TRStudent: 0x1005002a0>”

)

=====================================================================================================

重写description方法,化解重临数值难点

-(NSString *)description{

    return [NSString stringWithFormat:@”age:%d
name:%@”,self.age,self.name];

}

================================================================================================================================================================================

知识点

八、NSMutableArray(可变数组)

1.NSMutableArray(可变数组)

是Objective-C定义的可修改数组类  

– 是NSArray的子类

2.开立数组

NSMutableArray* array=[NSMutableArray
arrayWithObjects:@”one”,@”two”,@”three”, nil];

3.增添成分

   1.在数组末尾增多对象

   2.在内定地方插入对象

#import <Foundation/Foundation.h>

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        NSMutableArray* array=[NSMutableArray
arrayWithObjects:@”one”,@”two”,@”three”, nil];

        [array addObject:@”four”];//在数组末尾增添对象

        NSLog(@”%@”,array);

        [array insertObject:@”five” atIndex:3];//插入对象

        NSLog(@”%@”,array);

    }

    return 0;

}

结果:

(

    one,

    two,

    three,

    four

)

(

    one,

    two,

    three,

    five,

    four

)

4.改造成分

 1.在钦赐地方修改成分

 2.用另一数组替换钦定范围对象

NSMutableArray* array=[NSMutableArray
arrayWithObjects:@”one”,@”two”,@”three”, nil];

[array replaceObjectAtIndex:1 withObject:@”six”];//在钦赐地点修改成分

         NSLog(@”%@”,array);

//用另一数组替换钦赐范围对象

        NSMutableArray* array2=[NSMutableArray
arrayWithObjects:@”1″,@”2″,@”3″, nil];

        NSRange r={2,1};

        [array replaceObjectsInRange:r withObjectsFromArray:array2];

        NSLog(@”%@”,array);

结果:

(

    one,

    six,

    three

)

(   one,

    six,

    1,

    2,

    3

)

5.刨除成分

 1.末尾一个对象

     [array  removeLastObject];  

 2.点名对象

    [array  removeObject:@”two”];

 3.钦命地方对象

   [array  removeObjectAtIndex:2];  

 4.内定范围对象

   NSRange  r  =  {1,  2};  

  [array  removeObjectsInRange:r];  

 5.清空数组

  [array  removeAllObjects];

//删除数组中的成分

        /*1,2,3,five,four*/

        [mArray removeLastObject];

        NSLog(@”mArray:%@”,mArray);

 

        [mArray removeObject:@”five”];

        NSLog(@”mArray:%@”,mArray);

 

        [mArray removeObjectAtIndex:1];

        NSLog(@”mArray:%@”,mArray);

 

        [mArray removeObjectsInRange:NSMakeRange(0, 2)];

        NSLog(@”mArray:%@”,mArray);

结果:

mArray1:(

    1,

    2,

    3,

    five

)

mArray2:(

    1,

    2,

    3

)

mArray3:(

    1,

    3

)

mArray4:(

)

 

练习:

#import <Foundation/Foundation.h>

#import “TRStudent.h”

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        TRStudent* stu1=[TRStudent studentWithAge:18
andName:@”zhangsan”];

        TRStudent* stu2=[TRStudent studentWithAge:20
andName:@”lisi”];

        NSMutableArray* class=[NSMutableArray
arrayWithObjects:stu1,stu2, nil];

        //增多学生

        TRStudent* stu3=[TRStudent studentWithAge:19
andName:@”zhaoliu”];

        [class addObject:stu3];

        NSLog(@”%@”,class);

        //删除学生 lisi

        //[class removeObjectAtIndex:0];

        //遍历数组

        for (int i=0; i<[class count]; i++) {

            TRStudent* stu=[class objectAtIndex:i];

            if ([stu.name isEqualToString:@”lisi”]) {//筛选出学生

                [class removeObject:stu];//删除学生

                 NSLog(@”%@”,class);

            }

        }

    }

    return 0;

}

结果:

(

    “age:18 name:zhangsan”,

    “age:20 name:lisi”,

    “age:19 name:zhaoliu”

)

(

    “age:18 name:zhangsan”,

    “age:19 name:zhaoliu”

)

6.ios6 新语法

a.ios6.0及osx10.8之后,编译器LLVM支持。

b.开端化数据

OC:[NSArray
arrayWithObject…@“a”];

OC新:@[@“a”,@“b”];

C语言:{“a”,“b”};

c.取成分的值

OC:[数组对象 objectAtIndex…];

OC新:数组对象[下标];

                    d.基本类型调换数值对象

                OC:@1->[NSNumber numberWithInt:1]

                OC新:NSArray *array2 = @[@’c’,@2,@3,@YES];

 

#import <Foundation/Foundation.h>

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        //初始化

        NSArray *array = [NSArray
arrayWithObjects:@”one”,@”two”,@”three”, nil];

        //ios6中的新语法

        NSArray *array2 = @[@”one”,@”two”,@”three”];

        //不容许将父类类型赋值给子类类型

        //NSMutableArray *array3 = @[@”one”,@”two”,@”three”];

*将不得变数组转变为可变数组

        //将不可变数组转变为可变数组

        NSMutableArray *array3
=[@[@”one”,@”two”,@”three”]mutableCopy];

        //取成分的值

        NSString *str = [array objectAtIndex:0];

        //ios6中的新语法

        NSString *str2 = array[0];

    }

    return 0;

}

 

 

作业:

1.重构 使用ios6新语法 学生与本校的有趣的事。

2.重构 使用三种遍历格局 

#import <Foundation/Foundation.h>

#import “TRStudent.h”

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        //学生

        TRStudent *stu1 = [TRStudent studentWithAge:18
andName:@”zhangsan”];

        TRStudent *stu2 = [TRStudent studentWithAge:22
andName:@”li”];

        TRStudent *stu3 = [TRStudent studentWithAge:19
andName:@”zhaoliu”];

        TRStudent *stu4 = [TRStudent studentWithAge:19
andName:@”wangwu”];

        TRStudent *stu5 = [TRStudent studentWithAge:20
andName:@”qianqi”];

        TRStudent *stu6 = [TRStudent studentWithAge:21
andName:@”guanyu”];

        TRStudent *stu7 = [TRStudent studentWithAge:20
andName:@”zhangfei”];

        TRStudent *stu8 = [TRStudent studentWithAge:18
andName:@”liubei”];

        //班级

        NSArray
*[email protected][stu1,stu2];

        NSArray
*[email protected][stu3,stu4];

        NSArray
*[email protected][stu5,stu6];

        NSArray
*[email protected][stu7,stu8];

        //学院

        NSArray
*[email protected][class1,class2];

        NSArray
*[email protected][class3,class4];

        //学校

        NSArray
*[email protected][college1,college2];

        

        /**/

//c语言遍历数组

        for (int i=0; i<[university count]; i++) {

            NSArray* college=university[i];

            //学院

            for (int j=0; j<[college count]; j++) {

                NSArray* class=”college”[j];

                //班级

                for (int k=0; k<[class count]; k++) {

                    TRStudent*stu=class[k];

                    NSLog(@”%@”,stu);

                }

            }

        }

       

      

      /**/

//枚举遍历

        for (NSArray* stu11 in university) {

       

            for (NSArray* stu22 in stu11) {

                //NSArray*class=stu22;

                for (TRStudent* stu33 in stu22) {

                    NSLog(@”%@”,stu33);

                }

            }

        }

       

//迭代器

        NSEnumerator *enumerator=[university objectEnumerator];

        NSArray *str=nil;

        while (str=[enumerator nextObject]) {

            //学院

            NSEnumerator *enumerator1=[str objectEnumerator];

            NSArray *str2=nil;

            while (str2=[enumerator1 nextObject]) {

                //班级

                NSEnumerator *enumerator2=[str2 objectEnumerator];

                TRStudent *str3=nil;

                while (str3=[enumerator2 nextObject]) {

                    NSLog(@”%@”,str3);

                }

            }

        }

    }

    return 0;

}

 

3.National类 著名称China,具有八个地段,有地方

Area(名称、人口)

创办四个地区

(beijing 3000 guangzhou 2000 shanghai 2200)

来得全数城市及人口

只体现香港的人数

重构… ios6新语法 遍历两种方法

TRNational.h

#import <Foundation/Foundation.h>

 

@interface TRNational : NSObject

@property(nonatomic,copy)NSString *name;

@property(nonatomic,strong)NSMutableArray *areas;

@end

TRNational.m

#import “TRNational.h”

 

@implementation TRNational

 

@end

TRArea.h

#import <Foundation/Foundation.h>

 

@interface TRArea : NSObject

@property(nonatomic,copy)NSString *name;

@property(nonatomic,assign)int population;

-(id)initWithName:(NSString*)name andPopulation:(int)population;

+(id)areaWithName:(NSString*)name andPopulation:(int)population;

@end

TRArea.m

#import “TRArea.h”

 

@implementation TRArea

-(id)initWithName:(NSString*)name andPopulation:(int)population{

    self = [super init];

    if (self) {

        self.name = name;

        self.population = population;

    }

    return self;

}

+(id)areaWithName:(NSString*)name andPopulation:(int)population{

    return [[TRArea alloc]initWithName:name
andPopulation:population];

}

@end

 

main.m

#import <Foundation/Foundation.h>

#import “TRNational.h”

#import “TRArea.h”

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        TRNational *n = [[TRNational alloc]init];

        n.name = @”china”;

        //贰个目的中的属性 如若是指标,要小心暗中认可景况下,是不会创设的。

        //聚合

        n.areas = [NSMutableArray array];

        TRArea *a1 = [TRArea areaWithName:@”北京”
andPopulation:3000];

        TRArea *a2 = [TRArea areaWithName:@”上海”
andPopulation:2200];

        TRArea *a3 = [TRArea areaWithName:@”广州”
andPopulation:2000];

        [n.areas addObject:a1];

        [n.areas addObject:a2];

        [n.areas addObject:a3];

        

        for (int i = 0; i<[n.areas count]; i++) {

            TRArea *area = n.areas[i];

            NSLog(@”name:%@ pop:%d”,area.name,area.population);

        }

    }

    return 0;

}

结果:

name:北京 pop:3000

name:上海 pop:2200

name:广州 pop:2000

======================================================================================

知识点

九、NSSet

1.NSSet是二个冬天的,管理四个指标的集合类,最大特征
是汇集中不容许现身重复对象,和数学上的集聚含义是一 样的。  

2.除了九冬、不许重复之外,别的功用和NSArray是同样的

1.NSSet的创建

  TRStudent* stu1=[[TRStudent
alloc]initWithAge:18 andName:@”zhangsan”];

        //数值重复

        TRStudent* stu2=[[TRStudent alloc]initWithAge:18
andName:@”zhangsan”];

        //地址重复

        TRStudent* stu3=stu1;

        //创设多少个成团

        NSSet* set=[NSSet setWithObjects:stu1,stu2,stu3, nil];

        NSLog(@”%@”,set);

结果:

{(

    <TRAV4Student: 0x100202f10>,  stu3和stu1重复,只输出八个

    <TRStudent: 0x100201b70>

)}

2.hash措施(比较地址)

 1.Computer暗中认可感到对象的hash值同样,那么对象就一律、重复

 2.在生活中,hash值同样的重新满意不断大家的急需,须要重写hash方法

 3.hash方法重写有三种情形:

    1.把重临值写死,那么该类全体的靶子都大概同样

    2.把对象中的在那之中三个属性值作为重回值,属性值一样的,对象也大概一样

3.isEqual方法(比较值)

   1.比如再次回到值为真 显著五个对象是同样的。

   2.只要重回值为假 分明四个指标是区别样的。

推行顺序,会活动先推断hash值,hash一样才会活动判别isEqual方法。

 

总结:

a.判别援引是或不是是同二个, 是则大概相同,否一定不相同

b.判别援用的等级次序是还是不是一律, 是则只怕一样,
否一定差异,

c.推断引用的值是不是一样 ,是则终将一样,否一定分化,

TRStudent.h

#import <Foundation/Foundation.h>

 

@interface TRStudent : NSObject

@property(nonatomic,assign)int age;

@property(nonatomic,copy)NSString*name;

-(id)initWithAge:(int)age andName:(NSString*)name;

+(TRStudent*)studentWithAge:(int)age andName:(NSString*)name;

@end

TRStudent.m

#import “TRStudent.h”

 

//hash方法

@implementation TRStudent

-(NSUInteger)hash{

    NSLog(@”hash方法实行了”);

    //return [super hash];

    return 1;

}

//重写isEqual方法

-(BOOL)isEqual:(id)object{

    NSLog(@”isEqual方法施行了”);

    

    //return [super isEqual:object];

    //1.自反性

    if(self == object){//两个引用指向同多个指标

        return YES;

    }else{

        //2.类型是还是不是一律 若是类型分歧样 分明差异

        if(![object isMemberOfClass:[TRStudent class]]){

            return NO;

        }else{//3.多个指标的种类一样才相比较对象的值

            TRStudent *otherStu = object;

            if (self.age==otherStu.age&&[self.name
isEqualToString:otherStu.name]) {

                return YES;

            }else{

                return NO;

            }

        }

    }

    return NO;

    

}

 

-(id)initWithAge:(int)age andName:(NSString*)name{

    self = [super init];

    if (self) {

        self.age = age;

        self.name = name;

    }

    return self;

}

+(TRStudent*)studentWithAge:(int)age andName:(NSString*)name{

    return [[TRStudent alloc]initWithAge:age andName:name];

}

@end

main.m

#import <Foundation/Foundation.h>

#import “TRStudent.h”

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        TRStudent *stu1 = [TRStudent studentWithAge:18
andName:@”zhangsan”];

        TRStudent *stu2 = [TRStudent studentWithAge:18
andName:@”zhangsan”];

        TRStudent *stu3 = stu1;

        

        NSSet *set = [NSSet setWithObjects:stu1,stu2,stu3, nil];

        NSLog(@”set:%@”,set);

        

    }

    return 0;

}

结果:

hash方法施行了

hash方法推行了

isEqual方法实行了

hash方法实施了

set:{(

    <TRStudent: 0x1001027f0>

)}

 

知识点

十、NSMutableSet

 

知识点

十一、NSDictionary(不可变字典)

  1.为了索求集结中的对象更火速

  2.通过key(键)(名字),相应的value(值)。

     平日来说,key的值是字符串类型,value的值是即兴对象类型

  3.key值是不允许再一次的,value的值是能够再一次的

  4.通来来说key与value的值,不容许为空  

1.NSDictionary的创建

//初叶化的时候value->key

        NSDictionary* dic=[NSDictionary
dictionaryWithObjectsAndKeys:@1,@”one”,@2,@”two”,@3,@”three”, nil];

        //显示的时候 key->value

        NSLog(@”%@”,dic);

结果:

{

    one = 1;

    three = 3;

    two = 2;

}

2.透过key找到呼应的value

//依据key值找到呼应的value

        NSNumber* n1=[dic objectForKey:@”one”];dic接上头的内容

        NSLog(@”n1:%@”,n1);

        //字典援用 新语法

        NSNumber* n2=dic[@”one”];

        NSLog(@”n2:%@”,n2);

结果:

n1:1

n2:1

3.获得字典中具有的value和key

//集结中负有的key

        NSArray*key=[dic allKeys];

        NSLog(@”%@”,key);

        //集结中全体的value

        NSArray*v=[dic allValues];

         NSLog(@”%@”,v);

结果:

(

    one,

    two,

    three

)

(

    1,

    2,

    3

)

4.NSDictionary遍历

//遍历

        //获得字典中装有的key

        NSArray* keys=[dic allKeys];

        for (NSString* key in keys) {

            //通过每贰个key得到字典中的value

            NSNumber* value=[dic objectForKey:key];

            NSLog(@”key:%@ value:%@”,key,value);

        }

结果:

key:one value:1

key:two value:2

key:three value:3

5.NSDictionary新语法

1.创建

NSDictionary  *dict  =  @{@”1″:stu,  @”2″:stu1};

NSDictionary* dic=[NSDictionary
dictionaryWithObjectsAndKeys:@1,@”one”,@2,@”two”,@3,@”three”, nil];

 NSDictionary*
[email protected]{@”one”:
@1,@”two”:@2,@”three”:@3};//字典引用 新语法

2.获取

NSLog(@”%@”,  mdict[@”1″]); 

NSNumber* n1=[dic objectForKey:@”one”];

        //字典征引 新语法

        NSNumber* n2=dic[@”one”]; 

6.对重点字张开排序  

1.将字典中颇具key值,按object所在类中的compare方法
实行排序,并将结果重回至数组,2.在Student类中增多compare方法

#import <Foundation/Foundation.h>

#import “TRStudent.h”

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        TRStudent *stu1 = [TRStudent studentWithAge:18
andName:@”zhangsan”];

        TRStudent *stu2 = [TRStudent studentWithAge:19
andName:@”lisi”];

        TRStudent *stu3 = [TRStudent studentWithAge:20
andName:@”wangwu”];

        TRStudent *stu4 = [TRStudent studentWithAge:21
andName:@”zhaoliu”];

        NSDictionary *stus = [NSDictionary
dictionaryWithObjectsAndKeys:stu1,stu1.name,stu2,stu2.name,stu3,stu3.name,stu4,stu4.name,
nil];

        //排序前

        NSArray *allKeys = [stus allKeys];

        for (NSString *key in allKeys) {

            //key->value

            TRStudent *stu = stus[key];

            NSLog(@”name:%@ age:%d”,stu.name,stu.age);

        }

        //排序后

***//1.排序的率先种艺术 无法对字典举行排序 只好对key实行排序

        /**/

        //NSArray *allKeys = [stus allKeys];取出keys值

        NSArray *sortedAllKeys = [allKeys
sortedArrayUsingSelector:@selector(compare:)];

        for (NSString *key in sortedAllKeys) {

            //key->value

            TRStudent *stu = stus[key];

            NSLog(@”name:%@ age:%d”,stu.name,stu.age);

        }

TRStudent.h

-(NSComparisonResult)compare:(TRStudent*)otherStudent{

    return [self.name compare:otherStudent.name];

}        

***//2.字典排序形式2  需重写compare方法 如上

        NSArray *sortedAllKeys2 = [stus
keysSortedByValueUsingSelector:@selector(compare:)];

        for (NSString *key in sortedAllKeys2) {

            //key->value

            TRStudent *stu = stus[key];

            NSLog(@”name:%@ age:%d”,stu.name,stu.age);

        }

    }

    return 0;

}

 

7.文本操作

1.将字典内容写入文件

NSDictionary *dic = [NSDictionary
dictionaryWithObjectsAndKeys:@1,@”one”,@2,@”two”, nil];

        [dic writeToFile:@”/Users/tarena/Desktop/dic.xml”
atomically:NO];

练习 :学生和书的典故,字典方法。

(优:通过班级音讯方可平素突显学生消息、通过大学消息也得以一向展现学生音信)

#import <Foundation/Foundation.h>

#import “TRStudent.h”

int main(int argc, const char * argv[])

{

    @autoreleasepool {

        //学生

        TRStudent *stu1 = [TRStudent studentWithAge:18
andName:@”zhangsan”];

        TRStudent *stu2 = [TRStudent studentWithAge:22
andName:@”li”];

        TRStudent *stu3 = [TRStudent studentWithAge:19
andName:@”zhaoliu”];

        TRStudent *stu4 = [TRStudent studentWithAge:19
andName:@”wangwu”];

        TRStudent *stu5 = [TRStudent studentWithAge:20
andName:@”qianqi”];

        TRStudent *stu6 = [TRStudent studentWithAge:21
andName:@”guanyu”];

        TRStudent *stu7 = [TRStudent studentWithAge:20
andName:@”zhangfei”];

        TRStudent *stu8 = [TRStudent studentWithAge:18
andName:@”liubei”];

        //创制班级

        NSArray *class1412A = [NSArray arrayWithObjects:stu1,stu2,
nil];

        NSArray *class1412B = [NSArray arrayWithObjects:stu3,stu4,
nil];

        NSArray *class1412C = [NSArray arrayWithObjects:stu5,stu6,
nil];

        NSArray *class1412D = [NSArray arrayWithObjects:stu7,stu8,
nil];

        //创造高校

        NSDictionary *college3G = [NSDictionary
dictionaryWithObjectsAndKeys:class1412A,@”class1412A”,class1412B,@”class1412B”,
nil];

        NSDictionary *collegeTest = [NSDictionary
dictionaryWithObjectsAndKeys:class1412C,@”class1412C”,class1412D,@”class1412D”,
nil];

        //成立学校新语法

        /*

        NSDictionary *universityTarena = [NSDictionary
dictionaryWithObjectsAndKeys:college3G,@”college3G”,collegeTest,@”collegeTest”,
nil];

        */

        NSDictionary *universityTarena =
@{@”college3G”:college3G,@”collegeTest”:collegeTest};

        

        //遍历

        //学校

        NSArray *collegeKeys = [universityTarena
allKeys];//收取全部Keys

        for (NSString *collegeKey in collegeKeys) {

            NSDictionary *collegeValue = [universityTarena
objectForKey:collegeKey];

            //if… 查看有个别大学的学员新闻

            //遍历大学

            NSArray *classKeys = [collegeValue allKeys];

            for (NSString *classKey in classKeys) {

                /* 依据班级音信 展现学生音讯

                if ([classKey isEqualToString:@”class1412C”]) {

                    NSArray *classValue = [collegeValue
objectForKey:classKey];直接出口,无需遍历班级就能够

                }

                 */

                NSArray *classValue = [collegeValue
objectForKey:classKey];

                //遍历班级

                for (TRStudent *stu in classValue) {

                    /* 依照姓名查询学生音讯

                    if ([stu.name isEqualToString:@”zhangsan”]) {

                        NSLog(@”name:%@ age:%d”,stu.name,stu.age);

                    }*/

                    NSLog(@”name:%@ age:%d”,stu.name,stu.age);

                }

            }

        }

        

        

        

    }

    return 0;

}

===================================================================================================

知识点

十二、Block代码段

1.Block包装了段代码,可以在其余时候调用实行,Block能够当作艺术的参数、方法的再次来到值,和价值观的函数指针相似。

2.Block与函数的区分

a.Block是OC的语法

b.Block的定义能够写在措施中

c.使用起来更加直白,耦合度更低

d.间接用,不用表明

3.Block的语法

a.声明

重临值类型

Block变量名

参数

int(^Sum2)(int,int)

b.定义

重临值类型

参数

= ^int(int i,int j){

    return  i+j;

};

  c.调用

Block变量名

Sum2(1,2);

  d.自定义Block类型

Block类型

typedef void(^Block)(void);

Block b1;使用项目申明变量

b1();Block变量才方可选拔

 

1.Block的概念与申明

 1.声明定义在函数外

#import <Foundation/Foundation.h>

//^block的标识  Sum是block的名字

//证明时也能够省略到变量i,j

//经常定义与注明放到一齐

int(^Sum)(int i,int j)=^(int i,int j){

    return i+j;

};

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        int s=Sum(1,2);//block调用

        NSLog(@”%d”,s);

        

    }

    return 0;

}

结果:3

 

 2.定义在函数内部

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        //block的定义与证明能够松手函数内部

        int(^Sum2)(int i,int j);//声明

        Sum2=^(int i,int j){//定义

            return i+j;

        };

        int s2=Sum2(3,4);//block调用

        NSLog(@”%d”,s2);

    }

    return 0;

}

结果:7

1.Block的排序

@autoreleasepool {

        TRStudent* stu1=[TRStudent studentWithAge:18
andName:@”zhangsan”];

        TRStudent* stu2=[TRStudent studentWithAge:23
andName:@”lisi”];

        TRStudent* stu3=[TRStudent studentWithAge:22
andName:@”wangwu”];

        TRStudent* stu4=[TRStudent studentWithAge:17
andName:@”fangwu”];

        NSArray* array=[NSArray arrayWithObjects:stu1,stu2,stu3,stu4,
nil];

        NSLog(@”%@”,array);

        NSArray* array2=[array
sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

            TRStudent*stu11=obj1;//利用多个拓展相比较

            TRStudent*stu21=obj2;

            //return [stu1.name compare:stu2.name];

             NSNumber*n1=[NSNumber numberWithInt:stu11.age];

             NSNumber*n2=[NSNumber numberWithInt:stu21.age];

            return [n1 compare:n2];

            

        }];

        NSLog(@”%@”,array2);

结果:

(

    “age:18 name:zhangsan”,

    “age:23 name:lisi”,

    “age:22 name:wangwu”,

    “age:17 name:fangwu”

)

(

    “age:17 name:fangwu”,

    “age:18 name:zhangsan”,

    “age:22 name:wangwu”,

    “age:23 name:lisi”

)

 

2.自定义Block类型

//自定义

        //     重返值类型  Block是项目      参数

        typedef void(^Block)(void);

        Block b1;

        b1=^{

            NSLog(@”Block”);

        };//注意封号

        b1();//调用

结果:

Block

作业:

1.通讯录

TelphoneInfo

name

有四个顾客

增多客商新闻addUser:(TRUserInfo*)…

去除客户音讯->依照客商姓名removeUserByName

查看(单)
某人音讯->依照客户姓名

checkByName

查看(多) 全部人消息

list…

查看(多)
全体人新闻->依照客商姓名排序

sortedListByName…

用户

UserInfo

name

email

telphone

show 突显客户消息

TRUserInfo.h

#import <Foundation/Foundation.h>

 

@interface TRUserInfo : NSObject

@property(nonatomic,copy)NSString *name;

@property(nonatomic,copy)NSString *telphone;

@property(nonatomic,copy)NSString *email;

-(id)initWithName:(NSString *)name andTelphone:(NSString *)telphone
andEmail:(NSString *)email;

+(TRUserInfo*)userInfoWithName:(NSString *)name andTelphone:(NSString
*)telphone andEmail:(NSString *)email;

-(void)show;

@end

 

TRUserInfo.m

#import “TRUserInfo.h”

 

@implementation TRUserInfo

-(id)initWithName:(NSString *)name andTelphone:(NSString *)telphone
andEmail:(NSString *)email{

    self = [super init];

    if (self) {

        self.name = name;

        self.telphone = telphone;

        self.email = email;

    }

    return self;

}

+(TRUserInfo*)userInfoWithName:(NSString *)name andTelphone:(NSString
*)telphone andEmail:(NSString *)email{

    return [[TRUserInfo alloc]initWithName:name andTelphone:telphone
andEmail:email];

}

-(void)show{

    NSLog(@”name:%@ telphone:%@
email:%@”,self.name,self.telphone,self.email);

}

@end

 

TRTelphoneInfo.h

#import <Foundation/Foundation.h>

#import “TRUserInfo.h”

@interface TRTelphoneInfo : NSObject

@property(nonatomic,copy)NSString *name;

-(id)initWithName:(NSString*)name;

+(id)telphoneInfoWithName:(NSString*)name;

//增添顾客新闻

-(void)addUser:(TRUserInfo*)user;

//删除客商音信

-(void)removeUserByName:(NSString*)name;

//查看某人消息

-(void)checkUserByName:(NSString*)name;

//查看全部人音讯

-(void)list;

//查看所有人音讯并排序

-(void)sortedListByName;

@end

 

TRTelphoneInfo.m

#import “TRTelphoneInfo.h”

//扩大方法  组合

@interface TRTelphoneInfo()

@property(nonatomic,strong)NSMutableArray *userInfos;

@end

 

@implementation TRTelphoneInfo

-(id)initWithName:(NSString*)name{

    self = [super init];

    if (self) {

        self.name = name;

        self.userInfos = [NSMutableArray array];

    }

    return self;

}

+(id)telphoneInfoWithName:(NSString*)name{

    return [[TRTelphoneInfo alloc]initWithName:name];

}

 

//加多客户消息

-(void)addUser:(TRUserInfo*)user{

    [self.userInfos addObject:user];

}

//删除顾客音信

-(void)removeUserByName:(NSString*)name{

    TRUserInfo *temp = nil;

    for (TRUserInfo* userInfo in self.userInfos) {

        if([userInfo.name isEqualToString:name]){

            temp = userInfo;

        }

    }

    [self.userInfos removeObject:temp];

}

//查看有些人信息

-(void)checkUserByName:(NSString*)name{

    BOOL isFlag = NO;

    for (TRUserInfo* userInfo in self.userInfos) {

        if([userInfo.name isEqualToString:name]){

            //NSLog(@”name:%@ telphone:%@
email:%@”,userInfo.name,userInfo.telphone,userInfo.email);

            isFlag = YES;

            [userInfo show];

            break;

        }

    }

    if (!isFlag) {

        NSLog(@”您输入的全名不设有,请重新输入!”);

    }

}

//查看全部人音信

-(void)list{

    for (TRUserInfo* userInfo in self.userInfos) {

        [userInfo show];

    }

}

//查看全体人新闻并排序

-(void)sortedListByName{

    NSArray *sortedUserInfos = [self.userInfos
sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

        TRUserInfo *stu1 = obj1;

        TRUserInfo *stu2 = obj2;

        return [stu1.name compare:stu2.name];

    }];

    

    for (TRUserInfo* userInfo in sortedUserInfos) {

        [userInfo show];

    }

}

@end

 

main.m

#import <Foundation/Foundation.h>

#import “TRUserInfo.h”

#import “TRTelphoneInfo.h”

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        TRUserInfo *u1 = [TRUserInfo userInfoWithName:@”zhangsan”
andTelphone:@”13700000000″
andEmail:@”[email protected]”];

        TRUserInfo *u2 = [TRUserInfo userInfoWithName:@”lisi”
andTelphone:@”13800000000″
andEmail:@”[email protected]”];

        TRUserInfo *u3 = [TRUserInfo userInfoWithName:@”wangwu”
andTelphone:@”13900000000″
andEmail:@”[email protected]”];

        TRTelphoneInfo *telphoneInfo = [TRTelphoneInfo
telphoneInfoWithName:@”电信”];

        //增加顾客消息

        [telphoneInfo addUser:u1];

        [telphoneInfo addUser:u2];

        [telphoneInfo addUser:u3];

        //查看全数顾客音讯

        //[telphoneInfo list];

        //查看按姓名排序的具有客商新闻

        //[telphoneInfo sortedListByName];

        //查看某一个人的音讯 通过名字

        //[telphoneInfo checkUserByName:@”lisi”];

        //根据姓名 删除某一个人的音讯

        [telphoneInfo removeUserByName:@”lisi”];

        [telphoneInfo list];

    }

    return 0;

}

 

作业2:

学生管理连串

1.创设班级

2.删减班级

3.查询全体班级

4.向班级中增加学生

5.查询全数班级具备学员

6.删除班级中的学生

7.学生有学习战表(语文、数学、乌克兰语)

8.将学员的成就排序

 

补充:

1.Runtime是什么

1.是OC语言提供的局地C函数库,这一个C函数能够在程序运维时期获得类新闻,创设对象,调用方法。。。

2.当由此Selector调用方法时,编写翻译器不能够肯定内部存款和储蓄器中是不是不正常,会有相应警告出现,能够用以下措施收回警告。

3.OC真在在实践的时候,会先翻译成C++/C,再调换来汇编代码(Computer识其余代码)。OC非真正面向对象,而是假的面向对象。

2.NSObjectRuntime.h头文件串的函数

NSStringFromSelector
//依据议程得到格局名

NSSelectorFromString
//依据章程名得到格局

NSStringFromClass //依照类获取类名

NSClassFromString //依据类名获取类

NSStringFromProtocol
//依据商业事务获得协议名

NSProtocolFromString
//依据协议名猎取合同

 

NSDictionary *user = @{@”className”:@”TRPerson”,

@”property”:@{@”name”:@”zhangsan”,@”gender”:@”female”},

@”method”:@”show”};

NSDictionary *user2 = @{@”className”:@”TRPerson”,

@”property”:@{@”name”:@“lisi”,@“gender”:@“Male”},

@”method”:@”show”};

NSArray *users = @[user,user2];

例:

@autoreleasepool {

        

        //通过字符串新闻,也足以创制对象

        NSString *className = @”TRPerson”;

        Class class = NSClassFromString(className);

        id obj = [[class alloc]init];

        NSString *methodName = @”show”;

        SEL method = NSSelectorFromString(methodName);

        [obj performSelector:method];

        NSString *name = @”zhangsan”;

        NSString *gender = @”male”;

        SEL setName = NSSelectorFromString(@”setName:”);

        [obj performSelector:setName withObject:name];

        SEL setGenger = NSSelectorFromString(@”setGender:”);

        [obj performSelector:setGenger withObject:gender];

        [obj performSelector:method];

        

        //模拟动态创造对象,能够叫反射

        //依照文件中读出来的数据 创造相应的靶子

 

        NSDictionary *user = @{@”className”:@”TRPerson”,

@”property”:@{@”name”:@”zhangsan”,@”gender”:@”female”},@”method”:@”show”};

        NSArray *users = @[user,user2];

        for (NSDictionary *user in users) {

            //通过运维时 获得目的 属性 方法

            //创造三个目的 ***置于对象数组中

        }

        

    }

copy:获得贰个不足更动的指标,复制了一份。NSstring

strong:只获得贰个内部存款和储蓄器空间        NSMutableString

ARC:

NSstring 、block:copy

OC对象:strong

大致基本数据类型、结构体: assign

类:NSObject
、NSString、NSMutableString、NSNumber、NSValue、NSDate、NSDateFormatter、NSRange、Collections:…

NSRange range = NSRangeMake;

//6.———————-componentsJoinedByString

//数组中贮存的倘若是字符串的话,能够行使连接符将其具备的要素举办连接

//注意数组中的成分必需都以字符串

NSString*content = [array1componentsJoinedByString:@”,”];

//访问数组最终多个要素

NSString*lastObj = [array1 lastObject];

//在原来的数组前边增港成分,重临二个新的数组对象,因为他是不可变的

NSArray*array3= [array1arrayByAddingObject:@”zhaoliu”];

//数组的遍历

for(inti=0;i

NSString*str = [array1objectAtIndex:i];

NSLog(@”%@”,str);

}

//快捷遍历

for(NSString*s in array1){

NSLog;

}

//xcode4.4事后,编写翻译器对数组的创导和访问语法做了优化

NSArray*array7= @[s1,s2,s3];

NSString*s = array7[0];

NSString*str1=@”zhangsan”;

NSString*str2=@”lisi”;

NSString*str3=@”wangwu”;

NSMutableArray*mArray1=
[[NSMutableArrayalloc]initWithObjects:str1,str2,str3,nilnil];

//上面包车型大巴这种艺术创设的数组是指鹿为马的

//上面包车型地铁这种措施是创制不可变数组的主意,无法呀关于可变数组的创导

//NSMutableArray *array1 = @[str1,str2,str3];

//先开发5个空中,用于存款和储蓄元素,当存款和储蓄的因素超过了5个,数组会自动叠合空间

NSMutableArray*mArray2=
[[NSMutableArrayalloc]initWithCapacity:5];

//使用类方式成立

NSMutableArray*mArray3= [NSMutableArrayarrayWithCapacity:5];

[mArray1addObject:str1];

[mArray1addObject:str2];

//加多数组,把mArray第11中学的全部因素全体抬高到mArray第22中学

[mArray2addObjectsFromArray:mArray1];

NSLog(@”mArray3 = %@”,mArray2);

//二维数组

//那几个是将mArray1增添到mArray2数组中,那样mArray2就产生了二维数组了

[mArray2addObject:mArray1];

//在内定的职位上插入特定成分

[mArray2insertObject:@”def”atIndex:0];

//替换到分

[mArray2replaceObjectAtIndex:0withObject:@”aaa”];

//调换三个因素的职位

[mArray2exchangeObjectAtIndex:0withObjectAtIndex:3];

//删除钦赐地方的因素

[mArray2removeObjectAtIndex:0];

//删除最终贰个成分

[mArray2removeLastObject];

//删除钦赐的目的

[mArray2removeObject:@”lisi”];

//删除全部的对象/清空列表

[mArray2removeAllObjects];

注:OC中尚无泛型的概念,所以对于数组中存放了差别档期的顺序的值,在运营的时候会报错的,这么些和Java比较,操作会集类的时候安全性就差了点。所以我们在操作集合类的时候需求留神的地方。

一、NSString的开始化方法:

+(NSString*)stringWithString:

NSString *str=@”hello”;

NSString *str1=[NSString stringWithString:str];

+(NSString*)stringWithFormat:

NSString

*str2=[NSStringstringWithFormat:@”hello%d”,10];

-(NSString*)initWithString:

NSString *str3=[[NSString alloc]initWithString:@”hello”];

-(NSString*)initWithFormat:

NSString *str4=[[NSString

alloc]initWithFormat:@”hello”];

range.location = 17;

range.length = 4;

NSRange range = {17, 4};

//5.———————-indexOfObject

//重临贰个目的在数组中的下标值

NSUInteger index = [array1indexOfObject:@”zhangsan”];

if(index == NSNotFound){

//未有找到

}else{

//找到了

}

// 推荐

发表评论

电子邮件地址不会被公开。 必填项已用*标注