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