您现在的位置是:网站首页> IOS开发

Objective C 语法类

摘要

Objective-C 学习笔记

Objective-C与Java语法对比,帮助快速入门

Objective-C语法



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;
           

#import "MyTest.h"                

@class MyTest


基类
           
java.lang.Object
           
NSObject
           

接口
           

public interface MyTestFace {

}
           

@ protocol MyTestFace <NSObject>

@end
           


           

public class MyTest{

…                                   

}
           

@interface MyTest: NSObject

@end


               

@implementation MyTest

@end


               

Obj-C类是由

两部分组合成

一个类,

interface

负责声明方法、

变量,与传统                

的接口概念                

相似                

类继承
           

public class My extends MyP{

}
           

@interface My: MyP

@end
           

Obj-C的继承是

定义在

interface的

实现接口
           

public class My implements MyF{

}
           

@interface MyTest: NSObject<MyF>

@end
           

方法定义
           

public String executeTest() {

         return "Hello";

}
           

- (NSString *) executeTest{

    return @"Hello";

}
           

静态方法
           

public static String executeTest() {

         return "Hello";

}
           

+ (NSString *) executeTest{

    return @"Hello";

}
           

带1个

参数方法

public String exeTest(String strP) {

         return strP;

}
           

- (NSString *) exeTest:(NSString *)strP{

    return strP;

}
           

带n个

参数方法

public int exeTest(int i1,int i2,int i3){

         return i1+i2+i3;

}
           

- (int) exeTest:(int)i1 i2:(int)i2 i3:(int)i3{

    return i1+i2+i3;

}
           

Obj-C的参数

冒号前的定义,                

可以理解为                

参数别名

成员变量
           
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];
           

Obj-C是

[对象 方法]

方法调用

1个参数

myObj. executeTest(1);
           
[myObj executeTest:1];
           

方法调用

n个参数

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返回值类型,表示初始化完成的对象

子类可以重写父类的方法:

4.png


二、实例变量可见度和方法

实例变量的可见度:

@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后的字符串作为类名使用,并未导入类的接口内容

有效避免嵌套循环导入



Top