OC学习笔记之类005面向对象基础

1.定义并实现类
#import <Foundation/Foundation.h>

@interface Person : NSObject{
  NSString* _name;
  int _age;
}
//定义了一个setName:andAge:方法
-(void) setName:(NSString*) name andAge:(int) age;
//定义一个say方法
-(void) say:(NSString*) content;
//定义一个不带形参的info方法
-(NSString*) info;
//定义一个类方法
+(void) foo;
@end

@implementation Person{
  //定义一个只能在实现部分使用的成员变量
  int _testAttr;
}
//实现setName:andAge:方法
-(void) setName:(NSString*) name andAge:(int) age{
  _name=name;
  _age=age;
}
//实现say方法
-(void) say:(NSString*) content{
  NSLog(@"%@",content);
}
//定义一个只能在实现部分使用的方法(只在实现部分使用,所以不用再声明部分定义)
-(void) test{
  NSLog(@"--这是一个只能在实现部分使用的方法--");
}
//实现不带形参的info方法
-(NSString*) info{
  [self test];
  return [NSString stringWithFormat:@"我的名字是%@,年龄%d岁,",_name,_age];
}
//实现一个类方法
+(void) foo{
  NSLog(@"Person类的类方法,直接通过类名调用");
}
@end
2.声明类变量

声明类变量的方法

[[类名 alloc] 初始化方法]
[类名 new]

oc调用方法的语法格式

[调用者 方法名:参数 形参标签:参数值...];

定义自定义类型变量

类名* 变量名

一个完整的类声明,实现及实例方法、类方法的调用

#import <Foundation/Foundation.h>

@interface Person : NSObject{
  NSString* _name;
  int _age;
}
//定义了一个setName:andAge:方法
-(void) setName:(NSString*) name andAge:(int) age;
//定义一个say方法
-(void) say:(NSString*) content;
//定义一个不带形参的info方法
-(NSString*) info;
//定义一个类方法
+(void) foo;
@end

@implementation Person{
  //定义一个只能在实现部分使用的成员变量
  int _testAttr;
}
//实现setName:andAge:方法
-(void) setName:(NSString*) name andAge:(int) age{
  _name=name;
  _age=age;
}
//实现say方法
-(void) say:(NSString*) content{
  NSLog(@"%@",content);
}
//定义一个只能在实现部分使用的方法(只在实现部分使用,所以不用再声明部分定义)
-(void) test{
  NSLog(@"--这是一个只能在实现部分使用的方法--");
}
//实现不带形参的info方法
-(NSString*) info{
  [self test];
  return [NSString stringWithFormat:@"我的名字是%@,年龄%d岁,",_name,_age];
}
//实现一个类方法
+(void) foo{
  NSLog(@"Person类的类方法,直接通过类名调用");
}
@end


int main(int argc, const char * argv[]) {
  @autoreleasepool {
    Person* person;
    person=[[Person alloc]init];
    
    //Person* person1=[[Person alloc]init];
    [person say:@"使用对象调用一个实例方法"];
    [person setName:@"张三丰" andAge:120];
    NSLog(@"%@",[person info]);
    [Person foo];
  }
}

输出:
2020-05-15 18:08:44.345716+0800 EX003[4642:207993] 使用对象调用一个实例方法
2020-05-15 18:08:44.346013+0800 EX003[4642:207993] --这是一个只能在实现部分使用的方法–
2020-05-15 18:08:44.346078+0800 EX003[4642:207993] 我的名字是张三丰,年龄120岁,
2020-05-15 18:08:44.346114+0800 EX003[4642:207993] Person类的类方法,直接通过类名调用

自己写得一个例子

#import <Foundation/Foundation.h>
@interface Animal:NSObject{
  @public
  NSString* _color;
  NSString* _name;
  NSString* _food;
  int _legs;
  int _age;
}
//设置所有的成员变量,类似构造方法
-(void)setAll:(NSString*) name andColor:(NSString*) color andFood:(NSString*) food andLeg:(int) legs andAge:(int) age;
-(NSString*)eating:(NSString*) color andFood:(NSString*) food;
-(void)say;
+(void)run;

@end


@implementation Animal{
  int _distance;
}

//设置所有的成员变量,类似构造方法
-(void)setAll:(NSString*) name andColor:(NSString*) color andFood:(NSString*) food andLeg:(int) legs andAge:(int) age{
  _name=name;
  _color=color;
  _food=food;
  _legs=legs;
  _age=age;
}
-(void)say{
  NSLog(@"dog is wang wang wang");
}
//吃东西
-(NSString*)eating:(NSString*) color andFood:(NSString*) food{
  [self say];
  return [NSString stringWithFormat:@"the %@ %@ is eating %@",self->_name,color,food];
  
}
+(void)run{
  NSLog(@"the dog is runing fast");
}
@end

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    Animal* dog=[[Animal alloc]init];
    [dog setAll:@"大黄" andColor:@"yellow" andFood:@"brone" andLeg:4 andAge:3];
    //NSLog(@"%@",dog->_name);
    NSString* eatingfoot=[dog eating:dog->_color andFood:dog->_food];
    NSLog(@"%@",eatingfoot);
    [Animal run];
  }
}

输出:
2020-05-15 20:57:17.369349+0800 EX003[5452:270553] dog is wang wang wang
2020-05-15 20:57:17.369780+0800 EX003[5452:270553] the 大黄 yellow is eating brone
2020-05-15 20:57:17.369823+0800 EX003[5452:270553] the dog is runing fast

3.ID类型(万能类型类似于 java的Object类)

代表所有对象的类型,动态绑定类型

#import <Foundation/Foundation.h>
@interface Person:NSObject{
  @public
  NSString* _name;
}
-(void) say;
@end

@implementation Person

-(void) say{
  NSLog(@"we speak chinese");
}

@end

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    id myperson=[[Person alloc]init];//用person对象生成id类型
    [myperson say];
    
  }
}
4.pragma参数设置类提示
#pragma mark 人类的实现
@implementation Person

输出类提示

#pragma mark -

这里的一个横杠真的会生成一个横杠

#pragma mark - 人类的实现
#pragma mark -
#pragma mark 人类的实现
5.对象作为参数

Person.h

#import <Foundation/Foundation.h>
#import "Man.h"
NS_ASSUME_NONNULL_BEGIN

@interface Person:NSObject{
  @public
  NSString* _name;
}
-(void) say;
-(void) speakWith:(Man *) man;
@end

NS_ASSUME_NONNULL_END

Person.m

#import "Person.h"

@implementation Person
-(void) say{
  NSLog(@"we speak chinese");
}
-(void) speakWith:(Man *) man{
  NSLog(@"%@",[man printName]);
}
@end

Man.h

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Man :NSObject{
  @public
  NSString* _name;
}
-(NSString *)printName;


@end

NS_ASSUME_NONNULL_END

Man.m

#import "Man.h"

@implementation Man
-(NSString *)printName{
  return self->_name;
}
@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Man.h"


int main(int argc, const char * argv[]) {
  @autoreleasepool {
    Person* person1=[Person new];
    Man * man1=[Man new];
    man1->_name=@"zhangsan";    
    [person1 speakWith:man1];
  }
}

输出
2020-05-16 11:46:25.287937+0800 EX003[2196:69041] zhangsan

6.对象作为返回值
#import <Foundation/Foundation.h>
#pragma mark - 学生类

@interface Student:NSObject{
  @public
  NSString* _name;
  NSString* _college;
}
@end
@implementation Student


@end

#pragma mark - 人类
@interface Person:NSObject{
  @public
  NSString *_name;
  int _age;
  NSString* _major;
  
  
}

-(void)setAll:(NSString*)name andmajor:(NSString*)major;
-(Person *)modifyMajor:(NSString*)name andmajor:(NSString*)major;
-(Student *) allocateCollege:(Person *)person andWithName:(NSString *)name andCollege:(NSString *)college;

@end

@implementation Person

-(void)setAll:(NSString*)name andmajor:(NSString*)major{
  self->_major=major;
  self->_name=name;
}

-(Person *)modifyMajor:(NSString*)name andmajor:(NSString*)major{
  self->_major=major;
  self->_name=name;
  return self;
}

-(Student *) allocateCollege:(Student *)student andWithName:(NSString *)name andCollege:(NSString *)college{
  student->_name=name;
  student->_college=college;
  return student;
}
@end


int main(int argc, const char * argv[]) {
  @autoreleasepool {
    Person* p1=[Person new];
    [p1 setAll:@"张三" andmajor:@"中文"];
    Student* stu1=[Student new];
    
    Student* stu2= [p1 allocateCollege:stu1 andWithName:@"李四" andCollege:@"理学院"];
    NSLog(@"%@",stu2->_college);
    
    Person* p2=[p1 modifyMajor:@"张三" andmajor:@"软件工程"];
    NSLog(@"name:%@ major:%@",p2->_name,p2->_major);
  }
}

输出:
2020-05-17 11:35:11.552973+0800 EX003[1473:51190] 理学院
2020-05-17 11:35:11.553295+0800 EX003[1473:51190] name:张三 major:软件工程

7.对象作为属性
#import <Foundation/Foundation.h>
#pragma mark - 学生类

@interface Student:NSObject{
  @public
  NSString* _name;
  NSString* _college;
}
@end
@implementation Student


@end

#pragma mark - 人类
@interface Person:NSObject{
  @public
  NSString *_name;
  int _age;
  NSString* _major;
  
  Student* _student;
  
  
}

-(void)setAll:(NSString*)name andmajor:(NSString*)major;
-(Person *)modifyMajor:(NSString*)name andmajor:(NSString*)major;
-(Student *) allocateCollege:(Person *)person andWithName:(NSString *)name andCollege:(NSString *)college;

@end

@implementation Person

-(void)setAll:(NSString*)name andmajor:(NSString*)major{
  self->_major=major;
  self->_name=name;
}

-(Person *)modifyMajor:(NSString*)name andmajor:(NSString*)major{
  self->_major=major;
  self->_name=name;
  return self;
}

-(Student *) allocateCollege:(Student *)student andWithName:(NSString *)name andCollege:(NSString *)college{
  student->_name=name;
  student->_college=college;
  return student;
}
@end


int main(int argc, const char * argv[]) {
  @autoreleasepool {
    Person* p1=[Person new];
    [p1 setAll:@"张三" andmajor:@"中文"];
    Student* stu1=[Student new];
    
    Student* stu2= [p1 allocateCollege:stu1 andWithName:@"李四" andCollege:@"理学院"];
    NSLog(@"%@",stu2->_college);
    
    Person* p2=[p1 modifyMajor:@"张三" andmajor:@"软件工程"];
    NSLog(@"name:%@ major:%@",p2->_name,p2->_major);
    
    p1->_student=stu1;
    NSLog(@"%@",p1->_student->_name) ;
  }
}

输出
2020-05-17 15:14:36.679441+0800 EX003[1692:102642] 理学院
2020-05-17 15:14:36.679766+0800 EX003[1692:102642] name:张三 major:软件工程
2020-05-17 15:14:36.679810+0800 EX003[1692:102642] 李四

8.方法的可变参数
#import <Foundation/Foundation.h>
@interface Person:NSObject{
  NSString* _name;
  int* _age;
  NSString* _gender;
  NSString* _hometown;
  
}
-(void)printProperty:(NSString*)name,...;
@end

@implementation Person

-(void)printProperty:(NSString*)name,...{
  va_list arglist;//创建一个列表参数
  if (name) {
    NSLog(@"%@",name);
    va_start(arglist, name);//指向参数列表的第一个参数
    NSString* arg=va_arg(arglist, id);//创建可变参数变量,参数id类型应为不知道列表里会是什么参数,所以类型为id类型
    while (arg) {//当arg不为空nil
      NSLog(@"%@",arg);
      arg=va_arg(arglist, id);//往下移动一个参数
    }
  }
  
}


@end

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    Person* person=[Person new];
    [person printProperty:@"张三",@34,@"男",@"北京",nil];//最后一个参数设为nil方便跳出循环

   
  }
}

输出:
2020-05-17 17:07:02.007471+0800 EX003[1919:138269] 张三
2020-05-17 17:07:02.007799+0800 EX003[1919:138269] 参数
2020-05-17 17:07:02.007835+0800 EX003[1919:138269] 男
2020-05-17 17:07:02.007857+0800 EX003[1919:138269] 北京

9.模拟全局变量

在类实现部分定义一个static修饰的全局变量,并提供一个类方法来暴露概全局变量,

#import <Foundation/Foundation.h>
@interface User:NSObject
+(NSString*) nation;
+(void) setNation:(NSString*) newNation;
@end

@implementation User
//定义一个静态变量
static NSString* _nation=nil;
//通过这个函数将局部静态变量暴露出来
+(NSString*) nation{
  return _nation;
}
//设置局部变量
+(void) setNation:(NSString*) newNation{
  if (![_nation isEqualToString:newNation]) {
    _nation=newNation;
  }
}


@end


int main(int argc, const char * argv[]) {
  @autoreleasepool {
    [User setNation:@"中国"];
    NSLog(@"%@",[User nation]);//通过类方法,将局部变量暴露出来
   
  }
}

输出:中国

10.通过static变量实现单例模式

定义一个static全局变量,该变量用于保存已创建的Singleton对象。每次程序需要获取该实例时,都要先判断该static全局变量;如果该全局变量部位nil,那么程序直接返回该全局变量指向的实例即可。

#import <Foundation/Foundation.h>
@interface User:NSObject{
  @public
  NSString* _name;
}
+(id)instance;
@end

@implementation User
static id _instance=nil;
+(id)instance{
  if (!_instance) {//如果instance全局变量为nil
    //创建一个singleton实例,并将该实例赋值给_instance全局变量
    _instance=[[super alloc]init];//使用父类生成一个实例
  }
  return _instance;
}


@end


int main(int argc, const char * argv[]) {
  @autoreleasepool {
    //判断两次获取的实例是否相等,程序返回1
    NSLog(@"%d",[User instance]==[User instance]); 
  }
}

输出:
1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OC(Objective-C)是一种面向对象的编程语言,它支持在类中使用方法和block。类方法是在类中定义的方法,可以直接通过类名来调用,而不需要实例化对象。而block是一种闭包,可以在代码中定义并传递给方法或函数,用于延迟执行特定的逻辑。 在OC中,可以使用类方法来创建和操作类的实例,例如通过一个工厂方法创建对象,或者在类方法中实现一些与类相关的逻辑。类方法通常使用“+”符号进行声明和实现。 而block可以在方法中作为参数传递,也可以在方法中定义和使用。block可以捕获其所在作用域的变量,可以在方法内部延迟执行一段代码,也可以用于实现回调等功能。block的定义和使用使用“^(){}”语法。 类方法和block可以结合使用,例如可以在类方法中接受一个block作为参数,并在合适的时机调用该block,以实现一些灵活的逻辑。通过类方法和block的组合,可以在OC中实现更加灵活和强大的功能,例如在异步操作中使用block来回调结果,或者在工厂方法中使用block来定制对象的初始化逻辑等。 总而言之,类方法和block是OC中的两个重要特性,它们可以分别用于类的操作和延迟执行逻辑,也可以结合使用以实现更加灵活的功能。在实际的OC开发中,类方法和block通常会被广泛使用,可以帮助开发者更加简洁和灵活地实现代码逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值