黑马程序员——Objective-C语言知识整理——匿名类与self/super关键字

------- android培训、java培训、IOS培训期待与您交流! ----------

1、匿名类的概念

匿名类的使用,其实匿名对象的使用。并不在内存栈区分配指针变量空间。

匿名类使用类的成员变量:

使用格式:[类名 new]->变量名;

匿名类使用类的方法:

[[类名 new] 方法名];

匿名类可以作为方法的参数:

[类名1 方法名:[类名2 new]];

2、类方法的使用

代码示例:

#import 


//定义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;
}

内存分配情况:

黑马程序员——Objective-C语言知识整理——匿名类与self/super关键字_第1张图片

3、匿名类的使用

代码示例:

#import 


//定义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。

内存分配情况:

黑马程序员——Objective-C语言知识整理——匿名类与self/super关键字_第2张图片

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) 用在类方法中

在类方法中指代当前的类,而不是当前对象,如下图所示

黑马程序员——Objective-C语言知识整理——匿名类与self/super关键字_第3张图片

代码示例:

#import 


//定义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 


//定义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;
}
内存分配情况:

黑马程序员——Objective-C语言知识整理——匿名类与self/super关键字_第4张图片

(3) 访问成员变量

使用self->成员变量名。

(4) self在OC内存管理的特殊使用

你可能感兴趣的:(objective-c,匿名类,self关键字)