------- android培训、java培训、IOS培训期待与您交流! ----------
1、匿名类的概念
匿名类的使用,其实匿名对象的使用。并不在内存栈区分配指针变量空间。
匿名类使用类的成员变量:
使用格式:[类名 new]->变量名;
匿名类使用类的方法:
[[类名 new] 方法名];
匿名类可以作为方法的参数:
[类名1 方法名:[类名2 new]];
2、类方法的使用
代码示例:
#import <Foundation/Foundation.h> //定义Car类 #pragma mark Car类 @interface Car : NSObject { @public int _speed;//车速 } - (void)Start;//开车 - (void)Stop;//停车 @end //Car类的实现 @implementation Car - (void)Start { NSLog(@"车辆起步,将以%d车速可劲跑",_speed); } - (void)Stop { NSLog(@"车辆停止"); } @end int main(int argc,const char * argc[]){ @autoreleasepool{ //创建car对象 Car *car = [Car new]; car->_speed = 50;//初始化运行速度 [car Start];//对象方法调用 [car Stop];//对象方法调用 } return 0; }
内存分配情况:
3、匿名类的使用
代码示例:
#import <Foundation/Foundation.h> //定义Car类 #pragma mark Car类 @interface Car : NSObject { @public int _speed;//车速 } - (void)Start;//开车 - (void)Stop;//停车 @end //Car类的实现 @implementation Car - (void)Start { NSLog(@"车辆起步,将以%d车速可劲跑",_speed); } - (void)Stop { NSLog(@"车辆停止"); } @end int main(int argc,const char * argc[]){ @autoreleasepool{ Car *car = [Car new]; car->_speed = 50; NSLog(@"汽车的运行速度为%d",[Car new]->_speed); } return 0; }
输出结果为:汽车的运行速度为0
代码分析:匿名类使用后,会重新分配内存空间,并初始化_speed为0。
内存分配情况:
4、匿名类的使用说明
(1) 匿名类的使用可以访问类的成员变量,但只能访问一次。再次使用就会重新分配内存空间并初始化。
(2) 使用匿名类可以调用类的方法,使用格式为:[[类名 new] 方法名];
(3) 匿名类可以作为方法的参数使用,使用格式: [类名1 方法名:[类名2 new]];
补充:[类名 new]的使用等同于[[类名 alloc] init],即分配内存空间与初始化操作。
5、匿名类使用优点
(1) 可以简化代码,不用申请对象变量。
(2) 方便调用,且节省内存空间,不用分配内存栈区的指针变量空间。
6、self/super关键字介绍
Objective-C中提供的两个关键字,但不以@开头。
self用于方法定义中引用执行该方法的对象,相当于C++中的this指针。
super用于发送消息将方法实现分发给当前类的父类。
super在类方法中使用,调用的是父类的类方法,在对象方法中使用,调用的是父类的对象方法。
7、self使用场景
(1) 用在类方法中
在类方法中指代当前的类,而不是当前对象,如下图所示
代码示例:
#import <Foundation/Foundation.h> //定义Person类 #pragma mark Person类 @interface Person : NSObject + (void)run;//跑 + (void)test; @end //Person类的实现 @implementation Person + (void)run { NSLog(@"run"); } + (void)test { NSLog(@"+ test"); [self run];//self是当前类,不能调用对象方法 } @end int main(int argc,const char * argc[]){ @autoreleasepool{ Person *p = [Person new]; //[p class]返回当前类(类对象) NSLog(@"Person= %p",[p class]); [Person test]; } return 0; }
说明:在类方法中不能使用self调用对象方法。
(2) 用在对象方法中
在对象方法中使用,指代当前对象。
代码示例:
内存分配情况:#import <Foundation/Foundation.h> //定义Person类 #pragma mark Person类 @interface Person : NSObject - (void)Run;//跑 - (void)Eat:(NSString *) foodName;//吃 @end //Person类的实现 @implementation Person - (void)Run { NSLog(@"正在跑"); } - (void)Eat:(NSString *) foodName { NSLog(@"正在吃%@",foodName); [self Run];//同一个人 self对象调用Run方法 } @end int main(int argc,const char * argc[]){ @autoreleasepool{ Person *p = [Person new]; [p Eat:@"油条+鸡蛋"]; [p Run]; } return 0; }
(3) 访问成员变量
使用self->成员变量名。
(4) self在OC内存管理的特殊使用