- description 方法
#import
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *dog = [[Dog alloc] init];
dog.name = @"小黄";
dog.color = @"黄色";
NSLog(@"%@",dog);
}
return 0;
}
#import
@interface Dog : NSObject
@property NSString *name;
@property NSString *color;
@end
#import "Dog.h"
@implementation Dog
- (NSString *)description
{
NSString *str = [NSString stringWithFormat:@"这是一条名字是%@的狗,他得颜色是%@",_name,_color];
return str;
}
@end
【选择器】
一.认识选择器(Selector)
【注】选择器是一个变量类型
选择器的作用
1:选择支持了IOS开发中,控件的时间相应机制。
2:选择器可以令一个方法实现不同功能,增加代码复用度。
3:用于方法的回调。
SEL
【注】SEL的变量装消息 类似于函数指针
【见选择器Demo】
选择器Demo
#import
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *dog = [[Dog alloc] init];
dog.age = 10;
dog.name = @"旺财";
// [dog run];
// int a = 10;
// SEL类型的创建
SEL sel = @selector(run);
// 使用SEL类型
//在ARC(自动内存管理)的条件下,使用选择器,很可能会报警
//可照如下方式去除报警
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
/*调用方法写这里*/
[dog performSelector:sel];
// SEL 类型和字符串的转化
NSString *selStr = NSStringFromSelector(sel);
// 字符串转换成SEL类型
SEL selOne = NSSelectorFromString(selStr);
// SEL类型的调用方式
// 无参
[dog performSelector:selOne];
// 一个参数的
SEL selSleep = @selector(sleeWith:);
[dog performSelector:selSleep withObject:@"10"];
// [dog sleeWith:@"10"];
// SEL 最多传递2个参数
SEL selEat = @selector(eatPepleAtLittleTime:atBigTime:);
[dog performSelector:selEat withObject:@"8" withObject:@"16"];
// 调用我们的方法在某个线程,是否立马执行
//[dog performSelector:<#(SEL)#> onThread:<#(NSThread *)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>];
// 多长时间之后执行我们的方法
// [dog performSelector:selSleep withObject:@"20" afterDelay:5];
// 在后台执行
// [dog performSelectorInBackground:selSleep withObject:@"10"];
// 在主线程执行
// [dog performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>];
#pragma clang diagnostic pop
}
return 0;
}
#import
@interface Dog : NSObject
// 年龄
@property int age;
// 名字
@property NSString *name;
//
- (void)run;
- (void)eat;
// 狗要睡的时间
- (void)sleeWith:(NSString* )time;
- (void)eatPepleAtLittleTime:(NSString *)littleCount atBigTime:(NSString *)bigCount;
@end
#import "Dog.h"
@implementation Dog
- (void)run
{
NSLog(@"狗看见坏人,吓跑了");
}
- (void)eat
{
NSLog(@"狗把坏人吃了,拉肚子了");
}
- (void)sleeWith:(NSString *)time
{
int t = [time intValue];
NSLog(@"这条蠢睡了%d年",t);
}
- (void)eatPepleAtLittleTime:(NSString *)littleCount atBigTime:(NSString *)bigCount
{
NSLog(@"这条斗牛犬小时候吃了%@个人,长大了被%@个人吃了",littleCount, bigCount);
}
@end
SEL sel = @selector(crash);
[man performSelector:sel];
[man performSelector:@selector(setName:) withObject:@"Tom"];
//在ARC(自动内存管理)的条件下,使用选择器,很可能会报警
//可照如下方式去除报警
pragma clang diagnostic push
pragma clang diagnostic ignored "-Warc-performSelector-leaks"
/调用方法写这里/
pragma clang diagnostic pop
SEL sel = @selector(run);
// 这个方法用于编译时就能确定调用的方法
SEL sel = NSSelectorFromString(@"run");
// 这个方法用于运行时确定调用的方法
控件的事件机制
// 见选择器Demo_控件的事件机制
给可变数组添加方法(使用类别),可以添加任何对象,按照对象的某一个属性,排序
// 见选择器Demo_数组排序
#import "NSMutableArray+Sort.h"
#import "Lavra.h"
#import
//给可变数组添加方法,可以添加任何对象,按照对象的某一个属性,排序
int main(int argc, const char * argv[])
{
@autoreleasepool {
// 创建虫子
NSMutableArray *arrayM = [[NSMutableArray alloc] init];
int i = 0;
while (i++ < 5) {
//lavra地址不一样
Lavra *lavra = [[Lavra alloc] init];
// arc4random() % 10 从0-9中随机出来一个数
lavra.length = arc4random() % 10 +5;//随机数 arc4random()%10表示随机从10取出一个数
// arc4random()%10 + 5表示5个数
[arrayM addObject:lavra];
}
// 使用可变数组方法排序
[arrayM sortWithSelector:@selector(isLongerThanLavra:)];
NSLog(@"%@",arrayM);
}
return 0;
}
#import
@interface NSMutableArray (Sort)
- (void)sortWithSelector:(SEL)selector;
@end
#import "NSMutableArray+Sort.h"
#import "Lavra.h"
@implementation NSMutableArray (Sort)
- (void)sortWithSelector:(SEL)selector
{
for (int i = 0 ; i < self.count; i ++) {
for (int j = 0; j < self.count - i -1; j ++){
// Lavra *lavraj = self[j];
// Lavra *lavraj1 = self[j + 1];
// // [lavraj isLongerThanLavra:lavraj1]
if ([self[j] performSelector:selector withObject:self[j +1]]) {
[self exchangeObjectAtIndex:j withObjectAtIndex:j +1];
}
}
}
}
@end
#import
@interface Lavra : NSObject
// 虫子长度
@property NSUInteger length;
// 自己的长度与虫子的长度的对比
- (BOOL)isLongerThanLavra:(Lavra *)lavra;
@end
#import "Lavra.h"
@implementation Lavra
- (BOOL)isLongerThanLavra:(Lavra *)lavra
{
return self.length > lavra.length;
}
- (NSString *)description//这是父类的方法,已经存在,自己又继承父类,所以不用什么这个方法,可以使用,现在的这个方法叫重写
{
//再使用NSlog打印这个类的对象,就会打印这句话。
return [NSString stringWithFormat:@"虫子的长度是%ld",self.length];
}
@end
方法二:简单方法
#import
#import "Dog.h"
#import "NSMutableArray+Sort.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *dogOne = [[Dog alloc] init];
dogOne.age = 1;
Dog *dogTwo = [[Dog alloc] init];
dogTwo.age = 2;
Dog *dogThree = [[Dog alloc] init];
dogThree.age = 3;
// 把对象放进数组
NSMutableArray *arrayM = [[NSMutableArray alloc] initWithObjects:dogOne,dogTwo,dogThree, nil];
// 排序
[arrayM sortArray];
}
return 0;
}
#import
@interface NSMutableArray (Sort)
- (void) sortArray;
@end
#import "NSMutableArray+Sort.h"
#import "Dog.h"
@implementation NSMutableArray (Sort)
- (void)sortArray
{
for (int i = 0; i < self.count - 1; i ++) {
for (int j = i + 1; j < self.count ; j ++) {
Dog *dogI = self[i];
Dog *dogJ = self[j];
if (dogI.age > dogJ.age) {
[self exchangeObjectAtIndex:i withObjectAtIndex:j];
}
}
}
NSLog(@"%@",self);
}
@end
SEL来进行加减乘除
#import
#import "Student.h"
#import "Teacher.h"
#import "Calculator.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 1.获取计算器对象
Calculator *cal = [[Calculator alloc] init];
// 2.获取方法名
NSArray *array = @[@"plusA:withB:",@"minusA:withB:",@"multipA:withB:",@"divideA:withB:"];
NSString *plusStr = array[0];
// 3.把NSString 转成SEL
// SEL selOne = @selector(plusStr);//@selector(方法的名字,不能直接传一个字符串过去)
SEL sel = NSSelectorFromString(plusStr);
// 4.调用方法
NSInteger result = [cal compuA:@"100" withB:@"150" useSymbol:sel];
NSLog(@"%ld",result);
}
return 0;
}
#import
@interface Calculator : NSObject
// 传入一个方法 计算a、b的结果
- (NSInteger )compuA:(NSString *)a withB:(NSString *)b useSymbol:(SEL)symbol;
@end
#import "Calculator.h"
@implementation Calculator
- (NSInteger)compuA:(NSString *)a withB:(NSString *)b useSymbol:(SEL)symbol
{
// 谁拥有symbol这个方法谁去调用performSelector:
NSString *result = [self performSelector:symbol withObject:a withObject:b];
return [result integerValue];
}
// 加
- (NSString *)plusA:(NSString *)a withB:(NSString *)b
{
return [NSString stringWithFormat:@"%ld",[a integerValue] + [b integerValue]];
}
// 减法
- (NSString *)minusA:(NSString *)a withB:(NSString *)b
{
return [NSString stringWithFormat:@"%ld",[a integerValue] - [b integerValue]];
}
// 乘法
- (NSString *)multipA:(NSString *)a withB:(NSString *)b
{
return [NSString stringWithFormat:@"%ld",[a integerValue] * [b integerValue]];
}
// 除法
- (NSString *)divideA:(NSString *)a withB:(NSString *)b
{
return [NSString stringWithFormat:@"%ld",[a integerValue] / [b integerValue]];
}
@end
作业:
1.编写一个程序,创建一只猫,一只狗。每个类都有同样的一个方法,从终端读取方法名,让对象执行方法。
2.理解择器Demo_数组排序
// 见作业
Class
【注】Class也是类型,装类的类型。
//获取一个类的类型
Class cls = [Dog class];
//NSObject自带类方法class,将当前类转成Class类型。
Class cls = [Dog class];
//通过类的类型实例化的对象是id类型
id dog = [[cls alloc] init];
//Class变量,也能创建对象。
//强转换
Dog *d = (Dog *)dog;
BOOL ret = [dog isKindOfClass:[Dog class]];
//判断一个对象是否属于一个类
//把字符串准换成类
Class cls2 = NSClassFromString(@"Dog");
//Class变量也可以在运行时(runtime)赋值。
// Class一些方法的使用