您现在的位置是:网站首页> IOS开发
Objective C 语法类
- IOS开发
- 2023-07-09
- 671人已阅读
Objective-C 学习笔记
块
double (^hypot)(double,double)=^(double num1,double num2)
{
return sqrt(num1*num1+num2*num2);
}
NSLog(@"%g",htpot(3,4));
块类型指针
typedef void(^FKPrintBlock)(NSString *);
FKPrintBlock print=^(NSString *info)
{
NSLog(@"%g",info);
};
print(@"hello world");
Object-c的一个方法可以包含多个参数,除了第一个参数外,后面的所有参数都要写名字,这一点和其他的语言有很大的不同。
多个参数的写法
(方法的数据类型) 函数名: (参数1数据类型) 参数1的数值的名字 参数2的名字: (参数2数据类型) 参数2值的名字 …. ;
举个例子,一个方法的定义:
-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName;
实现这个函数的时候:
-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName{
大儿子 = myOldestKidName;
二儿子 = mySecondOldestKidName;
三儿子 = myThirdOldestKidName;
}
Kids *myKids = [[Kids alloc] init];
[myKids setKids: @”张大力” secondKid: @”张二力” thirdKid: @”张小力”];
Objective-C与Java语法对比,帮助快速入门
对比项 | Java | Objective-C | 备注 |
引入 | import java.util.Map; | ||
基类 | java.lang.Object | NSObject | |
接口 | |||
类 | @end | ||
类继承 | |||
实现接口 | |||
方法定义 | |||
静态方法 | |||
成员变量 | public String title; | @property NSString *title; | |
静态变量 | public static String title="Hello"; | static NSString *title =@"Hello"; | |
实例化 | MyTest myObj = new MyTest(); | MyTest *myObj =[[MyTest alloc] init]; | |
方法调用 | myObj. executeTest(); | [myObj executeTest]; | |
myObj. executeTest(1); | [myObj executeTest:1]; | ||
myObj. executeTest(1,2,3); | [myObj executeTest:1 i2:2 i3:3]; | ||
成员赋值 | myObj. title="Hello"; | myObj. title=@"Hello"; | |
空值 | null | nil | |
通用类 | java.lang.Object | id或instancetype | |
System.out.println("Hello); | NSLog(@"Hello"); |
Objective C语法
1.定义类
类的定义:
①接口部分:对外声明类的特征和行为 // 接口部分和实现部分要分开写
标识: @interface…@end
包含内容:类名、父类名、实例变量、方法等
②实现部分:对内实现行为
标识:@implementation...@end
包含内容:实现方法 即实现类的行为
.h文件(接口文件或头文件)
@interface person/*类名*/ : NSObject/*父类名*/{
@public //实例变量(特征)
NSString *_name; //姓名
NSString *_sex; //性别
NSString *_hobby; //兴趣
int _age; //年龄
}
/************方法(行为部分)************/
- (void)sayHi;- (void)eat;
@end
.m文件(实现文件)
@implementation person//实现方法(实现行为)
- (void)sayHi{ NSLog(@"你好,我叫%@,今年%d岁,喜欢%@",_name,_age,_hobby);
}
- (void)eat{
NSLog(@"我要去吃饭");
}
@end
2.创建对象
①分配内存空间:根据类中声明的实例变量为对象分配内存,将所有实例变量置为默认值0,并返回首地址
person *p = [person alloc];
②初始化:为对象的实例变量设置初始值
p = [p init];
以上两步可写在一起: person *p = [[person alloc]init];
+(id)alloc; +号表示这个方法属于类,只能类执行。id返回值类型,表示任意类型的对象,即创建好的对象
-(id)init; -号表示这个方法属于对象,只能对象执行。id返回值类型,表示初始化完成的对象
子类可以重写父类的方法:
二、实例变量可见度和方法
实例变量的可见度:
@public(公有的) :实例变量可以在类的外部和内部操作
@protected(受保护的,默认的) : 实例变量只能在该类和其子类内操作
@private(私有的) : 实例对象只能在该类内访问
方法:
①类方法:只能类使用 例:+(id)alloc 注:类方法不能使用实例变量
②实例方法:只能对象使用,例如:-(void)sayHi
例:- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject
包括:方法类型标示符,返回类型 ,参数形容词:参数类型,参数名
“ : ”标识参数不能省略。由冒号必须有参数
③方法使用:
[people sayHi]; 给people发送sayHi消息,或者使用点语法 people.sayHi;
1.setter:设置器(为实例变量赋值的方法)
如果一个实例变量是 int age 或者 _age.
setter书写格式:-(void)setAge:(int)age;(忽略下划线)
//传参时有几个冒号 ,就是传几个参数
2.getter:访问器(读取实例变量值的方法)
getter书写格式:-(int)age;(忽略下划线)
注意:无论是setter还是getter,内部操作都是实例变量,(每个实例变量都需要一对setter和getter方法)
3.自定义初始化方法:
-(id)initWithName:(NSString *)name sex:(NSString * )sex;
类的引用:
1.继承:父类 、子类
①继承是单向的,不可相互继承
②传递性:A继承于B,B继承于C,则A 同时具有 B和C的特征和行为
③子类可以继承父类全部的特征和行为(也可具备部分特征或行为)//@private标识的父类特征 不能被继承
④OC中只允许单继承(即每个类只能有一个父类)
⑤没有父类的类称为根类。OC中基类是NSObject(祖宗)
⑥继承的内容:所有实例变量和方法
⑦如果子类不满意父类方法的实现,可以重写父类的方法。
2.初始化方法
两步:①开辟空间alloc ②初始化init
作用:为某些实例变量赋初值
初始化方法在对象的整个生命周期里只是用一次
3.super 编译器指令,并非对象
作用:给super发消息,可以执行父类中实现的方法
子类可以重写父类的方法,即子类既有自己的实现,又有父类继承下来的实现,如果想使用父类的实现,向super发送消息
完整初始化方法:
@implementation Student
- (instancetype)init{
//给super发送init消息,即执行父类中实现的init方法
self = [super init];
if (self) {
//初始化设置
}
return self; //返回初始化完成的对象
}
//便利构造器:(+方法)
//封装了alloc和初始化方法,使用起来更加简洁
+(instancetype)girlFriendWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age{
GirlFriend *g = [[GirlFriend alloc]initWithName:name gender:gender age:age];
return g;
}
四、字符串、数组
#pragma mark ------------- NSString -----------
#pragma mark赋值
NSString*s1 =@"123";
NSLog(@"s1 = %@",s1);
#pragma mark初始化方法
//一般初始化
NSString*s2 = [[NSString alloc]initWithFormat:@"%@今年%@岁",@"小明",@"18"];
NSLog(@"s2 = %@",s2);
//便利构造器初始化
NSString*s3 = [NSString stringWithString:s2];
NSLog(@"s3 = %@",s3);
NSString*s4 = [NSString stringWithFormat:@"%@你好",@"美女"];
NSLog(@"s4 = %@",s4);
#pragma mark通过文件路径获取文件中的字符串
NSString*s5 = [NSString stringWithContentsOfFile:@"/Users/王胜利/Objective_C/OC_课堂及作业/OCLesson4_课后/OCLesson4_课后/1.txt"encoding:NSUTF8StringEncodingerror:nil];
NSLog(@"s5 = %@",s5);
//usedEncoding :表示不知道编码方式 写nil
#pragma mark length
NSUIntegerui = [s5 length];
NSLog(@"lenthOfs5 is %lu",ui);
#pragma mark前后缀
BOOLb1 = [s4 hasPrefix:@"美女"];//判断前缀
BOOLb2 = [s4 hasSuffix:@"约么"];//判断后缀
NSLog(@"前缀%d,后缀%d",b1,b2);
#pragma mark大小写转换
NSString*s6 =[s5 capitalizedString];
NSLog(@"首字母大写:%@",s6);
NSString*s7 = [s6 uppercaseString];
NSLog(@"所有字母大写:%@",s7);
NSString*s8 = [s7 lowercaseString];
NSLog(@"所有字母小写:%@",s8);
#pragma mark比较字符串大小
NSComparisonResult b3 = [s6 compare:s7];
NSLog(@"compareResult = %ld",b3);
#pragma mark判断字符串是否相等
BOOLb4 = [s6 isEqualToString:s8];
#pragma mark 获取某个index的字符(遍历)
NSLog(@"%c",[s6 characterAtIndex:3]);
#pragma mark截取字符串
NSString*s9 = [s6 substringFromIndex:3];//截取index = 3往后的内容(包含index = 3)
NSString*s10 = [s6 substringToIndex:2];//截取到index = 2(不包含index = 2)
NSString*s11 = [s6 substringWithRange:NSMakeRange(5,4)];//从index = 5开始截取4个字符
#pragma mark ----------NSMutableString---------
//NSMutableString 继承于NSString 上面NSString方法NSMutableString同样适用
NSMutableString*mS1 = [[NSMutableString alloc]initWithFormat:@"abc123"];
#pragma mark改
[mS1 setString:@"ABC123"];
#pragma mark拼接
[mS1 appendString:@"def"];
#pragma mark 替换掉某一范围的字符串
[mS1 replaceCharactersInRange:NSMakeRange(3,3) withString:@"456"];
#pragma mark删除
[mS1 deleteCharactersInRange:NSMakeRange(3,3)];
#pragma mark插入
[mS1 insertString:@"hijk"atIndex:5];
#pragma mark ---------------NSArray----------------
#pragma mark初始化方法
NSArray*a1 = [[NSArray alloc]initWithObjects:@"1",@"2",@"3",nil];
//便利构造器
NSArray*a2 = [NSArray arrayWithObjects:@"4",@"5",@"6",nil];
NSArray*a3 = [NSArray arrayWithArray:a2];
//字面量(语法糖)
NSArray*a4 =@[@"a",@"b",@"c"];
#pragma mark获取元素个数
NSUInteger ui1 = [a1 count];
#pragma mark取出元素下标
NSUInteger ui2 = [a4 indexOfObject:@"b"];
#pragma mark根据下标取出下标所有的元素
NSString*s = [NSString stringWithString:[a4 objectAtIndex:2]];
#pragma mark -----------NSMutableArray-----------
NSMutableArray*mA =[NSMutableArray arrayWithArray:a1];
#pragma mark 增加元素
[mAaddObject:@"4"];
#pragma mark 删除元素
[mA removeLastObject];
[mA removeObjectAtIndex:2];
#pragma mark插入元素
[mAinsertObject:@"3"atIndex:2];
#pragma mark替换
[mA replaceObjectAtIndex:2withObject:@"a"];
#pragma mark -------------NSNumber-----------
inti =2;
NSNumber*_i = [NSNumber numberWithInt:i];//将int基本数据类型转换成对象类型
[_i stringValue];//将对象类型 转换成 字符串
inta = [_i intValue];//将对象类型转换成基本数据类型
#import :导入头文件
#import “”导入自定义类
#import <>导入类库中的头文件
// 类似于C语言中的 #include 但是可以避免头文件重复导入
@class:
告诉编译器@class后的字符串作为类名使用,并未导入类的接口内容
有效避免嵌套循环导入
上一篇:Swift学习资源及总结
下一篇:IOS开发同行者