oc-语法

第一章

1.mian函数是入口整个工程的入口函数,一个工程仅有一个main函数
2.NSLog ===== System.out.println
3.每个字符串都是以"@"开头
4.占位符的使用

        int num = 10;
        float pi = 3.14;
        BOOL flag = true;
        char mychar = 'd';
        NSLog(@"整数的占位符为i:%i",num);
        NSLog(@"浮点类型的占位符为f:%.2f",pi);
        NSLog(@"布尔的占位符为d:%d",flag);
        NSLog(@"字符类型的占位符为c:%c",mychar);
        NSLog(@"请输入整型的数字:");

5.oc中的输入使用scanf,仅能输入int,float,char,BOOL类型

        int mynum = o;
        scanf("%i",&mynum);
        NSLog(@"获得输入的数字:%i",mynum)

如果想输入字符串信息,需要如下代码:

        char word[40];
        scanf("%s",word);
        NSString *info = [NSString stringWithCString:word encoding:NSUTF8StringEncoding];
        NSLog(@"%@",info)

6.import与include的区别

import会检查是否有重复的库,如果有,则忽略

include则不会

import""与<>的区别

"":用于引入内部的第三方类或类库

<>:用于引用系统类或类库

第二章 指针及引用

1.什么是指针

在内存中,任何一个变量都可以看成由三部分组成,变量名,值,以及存放它的地址

如果有一个变量,它的值存储着另一个变量的地址值,则可以吧它看作指针

例如:声明指针变量

        int *var;//声明指针变量
        int a = 10;//int变量
        var = &a //a变量的引用,即是a变量的地址,那么p的值就是a的地址
        NSLog(@"a变量的地址为;%p",&a);//打印a的地址:0x7fff5fbff83c
        NSLog(@"var指针变量的值为:%p",var)//0x7fff5fbff83c
        NSLog(@"*var的值与a的值相同:%i",*var)//10

那么,指针的指针变量:

        int **mypoint;
        mypoint = &var;
        NSLog(@"**mypoint的值与a的值相同,%i",**mypoint);

第三章类的基础定义以及自定方法

定义一个类,是由两个部分文件组成:.h和.m

.h文件是头文件,定义变量和声明方法。例如

        @interface Teacher:NSObject
        {
            //定义变量区
            int tid;
            NSString *tName;
        }
        /**
        * 方法的定义
        */
        -(void)setTid:(int)tid;
        -(void)setTName:(NSString *)tName;
        -(int) getTid;
        -(NSString *)getTName;
        @end

@interface定义类的关键字

NSObject是一切类的基类

在.h文件中声明的变量基本上都是公有变量,也可以用@private声明为私有变量。但是在苹果的代码规范中很少使用@privare声明。由于OC的动态消息传递机制,OC中不存在真正意义上的私有方法,如果你不在.h文件中声明,只在.m文件中实现,或在.m文件的Class Extension里声明,那么基本上和私有方法差不多。公有的放到.h文件,私有的放到.m文件,import时只import.h文件。
Teacher.m

#import "Teacher.h"
@implementation Teacher
- (void) setTid:(int)parTid
{
    self.tid = parTid;
}

- (NSString *) getTName
{
    return tName;
}

- (int) getTid
{
    return tid;
}

- (void) setTName:(NSString *)parTName
{
    self.tName = parTName;
}

- (void)test
{
    NSLog(@"私有方法");
}
@end

import 引用.h文件
@implementation实现.h文件中的所有方法
test方法,私有方法
Stydent.h

@interface Student:NSObject
@property(nonatomic,assign) int stiID;
@property(nonatomic,strong) NSString *stuName;
+(Student *)instance;
-(id) initWithStuId:(int) stuId andStuName:(NSString *)stuNAme;
@end

@property 用于定义可自动生成的getter和setter变量

对于@property属性的详解

使用@property定义property时可以在@property与类型之间用括号添加一些额外的指示符,常用的指示符由assign,atomic,copy,retain,strong,weak。

-assign:该指示符对属性只是简单的复制,不更改引用计数。常用语NSInteger等OC的基础类型,以及Short,inyt,double,结构体等C数据类型,因为这些类型不存在被内存回收的问题。

-atomic,nonatomic:指定setter和getter是否是原子操作,即是否线程安全,如果是atomic,那么存取方法都是线程安全的,即某一线程访问存活着取方法,其他线程不可以进入该存取方法。nonatomic则不具备线程安全的功能,需要指出的是,atomic是默认值,可以保证数据的完整性,但是相应的降低了性能,所以在单线程环境中建议使用nonatomic来提升性能。

-copy:如果使用copy指示符,当点用setter方法对成员变量赋值时,会将被复制的对象复制一个副本,再将该副本给成员变量,相应的原先的被赋值对象的引用计数加1.当成员变量的类型是可变类型,或其子类是可变类型,被赋值的对象在赋值后有可能再被修改,如果不需要这种修改,则可以考虑copy指示符。

-getter,setter。用于为getter方法,setter方法指定自定义方法名,如getter=myName,setter=setName:;setter方法后面有一个(:),这是因为我们需要在后面添加参数。
——readonly,readwrite:readonly指示系统只合成getter方法,不合成setter方法。readwrite是默认值,指示系统需要合成setter和getter方法。

-strong,weak。Strong指示符该属性对被赋值对象持有强引用,二weak指示符指定该属性对被赋值对象持有弱引用。强引用的意思是:只要该强引用指向被赋值的对象,那么该对象就不会自动回收,弱引用的意思是,即是该弱引用指向被赋值的对象,该对象也可能被回收吗,如果不希望对象被回收,可以使用strong指示符。如果需要保证程序性能,避免内存溢出,可以使用weak,内存一旦被回收,指针会被赋值为 inil。

-unsafe_unretained:与weak不同,被unsafe_unretained指针所引用的对象被回收后,unsaff_unretained指针不会被赋值为nil,可能会导致程序出错。

总结一下:

-strong和原来的retain比较相似,strong的property将对应_strong的指针,它将持有所指向的对象。

-weak不持有所指向的对象,而且当所指对象销毁时能将自己设置为nil,基本所有的outlet都应该用weak。

-unsafe_unretained就是原来的assign,当需要支持IOS4时需要用到这个关键字。
copy和原来基本一样,copy一个对象并且为其创建一个strong指针。

-assign对于对象来说应该永远不用assign,实在需要的话该用unsafe_unretained代替。但是对于基本类型比如int float BOOL double这样的还是要用assign

基本数据类型,如:int,float,BOOL,double等,使用assign

对象一般使用Strong,在非acr环境下,使用retain。

所有UI界面的对象使用weak,例如outlet对象。

OC中方法的定义

1.定义结构

StudentService.h

@interface StudentService:NSObject
-(Bool)loginfromForStuName:(NSString *)stuName andStuPwd:(NSString *) stuPwd;
@end

2.自定义构造方法

-(id) initWithStuId:(int) stuId andStuName:(NSString *) stuName{
    //调用弗雷德构造方法
    self = [super init];
    id(self!=nil){
        _stuID = stuId;
        _stuName = stuName;
    }
    return self;
}

3.静态方法

//静态方法
+(Student *)instance{
    return [[Student alloc]init];
}

使用类(调用方法)

使用类/调用构造方法,使用alloc实例化类,而尽量不要用new

Student *stu = [[Student alloc]init];
Student *stu2 = [[Student alloc]initWithStuId:1 andStuName:@"KKKK"];

调用自定义方法

StudentService *myService = [[StudentService alloc]init];
Bool isLogin = [myService loginfromForStuName:@"xxx" andStuPwd@"ddqdq"];

super相当于java中的super,self相当于java的this

调用静态方法

Student *stu = [Student instance];

使用类的属性

stu.stuID=1;
stu.stuName = @"zzzzz";

总结:调用类属性使用点语法(.)调用类方法使用[],实例化类使用alloc

常用字符串操作函数

常见的字符串创建

NSString *str = @"sdsadasd"

指针字符类型的转换为字符串

char *text = "蝴蝶结卡的空间啊薮";
str = [NSString stringWithUTF8String:text];

将URL请求响应转换为字符串

NSURL *url = [NSURL URLWithString:@"http://www.weather.com.cn/adat/sk/101010100.html"];
NSString *strText = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

将字符串转换为全大写字母/全部小写/首字母大写

//转换成大写
NSLog(@"大写:%@",[str uppercaseString]);
//转换成小写
NSLog(@"小写:%@",[str lowercaseString]);
//转换成首字母大写
NSLog(@"首字母大写:%@",[str capitalizedString]);

判断两个字符串是否相等

BOOL result = [@"abc" isEqualToString:@"ABC"];

字符串链接

NSString *str2 = [str stringByAppendingString:@"Shangdong"];
NSString *str3 = [NSString stringWithFormat:@"城市信息为:%@市%@省",str,str2];

字符串截取

NSString *str = @"123456789";
NSLog(@"%@",[str substringFromIndex:3]);
NSLog(@"%@",[str substringToIndex;3]);
NSRange range = NSMakeRange(4,5);
NSLog(@"%@",[str substringWithRange:range]);
NSString *str2 = @"1,2,3-4-5-6,7,8,9";
NSArray *array = [str2 componentsSeparatedByString:@"-"];
for(NSString *var in arrat){
    NSLog(@"%@",var);
}
NSString *str3 = [array objectAtIndex:0];
NSLog(@"%@",str3);

字符串转换

NSString *str = @"123";
int a = [str intvalue];
NSLog(@"%i",a);
float b = [str floatValue];
NSLog(@"%.2f",b);
NSString *str = @"划分空间啊函数";
NSLog(@"%zi".[str length]);
unichar temp = [@"dhjkashdjka" characterAtIndex:3];
NSLog(@"%c",temp);
//字符串转字符
const char *s = [@"dasdas" UTF8String];
NSLog(@"%s",s);

数组

创建数组

//创建数组两种方式
NSArray *array = @[@"one",@"two",@"three"];
NSArray *array2 = nil;
//nil只是一个结束标识,而不是其中一个元素
array2 = [NSArray arrarWithObjects;@"one",@"two",@"three",nil];

取元素(查)

NSLog(@"%@",array[2]);
NSLog(@"%@",[array objectAtIndex:1]);
NSLog(@"%@",[array firstObject]);
NSLog(@"%@",[array lastObject]);
//从数组中提取一个子数组
NSArray *array5 = [array5subarratWithRange:NSMakeRange(2,2)];
//containsObject 可以用来判断数组是否包含一个指定元素
if ([array4 containsObject:@"one"]){
    NSLog(@"array4 包含one");
}
//查出一个元素在数组中的索引位置
NSLog(@"three 在array4中的索引位置 %lu",[array4 indexofObject:@"three"]);

新增元素生成新的数组

//arrayByAddingObject给一个数组对象嫁一个元素生成一个新的数组
NSArray *array1 = [array arrayByAddingObject:@"four"];
//arrayByAddingObjectsFromArray给一个数组对象加一个数组生成一个新的数组
NSArray *array2 = [array arrarByAddingObjectsFromArray:array1];

获取大小

NSLog(@"%lu",[array count]);

循环

for(NSString *var in array){
    NSLog(@"%@",var);
}

其他

NSString *str1 = @"one:twe:dwd:dwf";
//用一个固定的分隔符把一个字符串隔开创建一个数组
NSArray *array4 = [str1 componentsSeparatedByString:@":"];

可变数组

创建

//创建一个可变数组
NSMutableArray *mtArray2 = [NSMutableArray arraWithCapacity:50];
NSMutableArray *mtArray1 = [[NSMutableArray alloc]init];

添加元素(增)

//往可变数组添加一个新的元素
[mtArray1 addObject:@"one"];
NSObject *newobj1 = [NSObject new];
[mtArray1 addObject:newobj1];

获取元素(查)

NSLog(@"%@",array[2]);
NSLog(@"%@",[array objectAtIndex:1]);

修改元素(改)

//替换掉指定索引位置的元素
[mtArray1 replaceObjectIndex:2 withObject:@"sasas"];
//在指定的索引位置插入一个新的元素
[mtArray1 insertObject:@"one4" atIndex:2];

删除元素(删除)

//从一个可变数组中移除一个元素
[mtArray1 removeObject:@"one2"];
[mtArray1 removeObjectAtIndex:2];

字典

不可变字典

创建

//value-key的赋值,最后一个必须是nil
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"zzzzz",@"name",@"12331313131",@"number",nil];
//初始化一个元素
NSDictionary *dict1 = [NSDictionary dictionaryWithObject:@"1" forkey:@"a"];
//初始化,利用数组
NSDictionary *dict2 = [NSDictionary dictionaryWithObject:[NSArray arrayWithObjects:@"1",@"2",@"3",nil] forKeys:[NSArray arrayWithObjects@"a",@"b",@"c",nil]];

数量

int count = [dict2 count];

得到字典中所有的key/value值

NSArray *allkeys = [dict2 allkeys];
NSArray *allvalues = [dict2 allvalues];

获取key对应的value

NSString *value = [dict2 valueForKey:@"b"];
NSString *value2 = [dict2 objectForKey:@"b"];

获得keys对应的values(数组)

NSArray *strarray = [dict2 objectsForKeys:[NSArray arrayWithObjects:@"a",@"d",@"c",nil] notFoundMarker:@"not found"];

遍历之for循环

变量名必须为key

for(NSString *key in dict2){
    NSLog(@"%@ = %@",key,[dict2 objectsForKeys:key]);
}

遍历之枚举

NSEnumrator *en = [dict2 keyEnumerator];
id keyvalue = nil;
while(keyvalue = [en nextObject]){
    NSLog(@"key:%@-value:%@",keyvalue,[dict2 valueForKey:keyvalue]);
}

可变字典

创建

NSMutableDictionarray *mtdict = [[NSMutableDictionarray alloc]init];

添加元素(增)

[mtdict setObject:@"1" forkey:@"a"];

删除元素(删)

[mtdict removeObjectForKey:@"a"];

获取key对应value(查)

NSString *value = [mtdict valueForKey:@"b"];
NSString *value2 = [mtdict objectsForKeys:@"b"];

修改元素值

// 原来有key=a的值,再次设置就想当于修改
[mtdict setObject:@"ffff" forkey:@"a"];

OC协议

OC协议==java中的接口

协议常用ui开发中事件设计模式,即委托设计模式的实现

@protocol为协议定义关键字,通常协议只是定义方法(函数),所以,只有.h文件

与java区别,在OC中协议常用分为两块,@required(必须,要求)和@optional(可选)

@required关键字下定义的方法,实现协议的类,必须实现该方法,默认的方法都是@required

@optional可选关键字,可以选择性实现和不实现

例如:

@protocol Emp
@required
-(void) work;
-(void) gongzi;
@optional
-(void) dakai;
@end

在OC中实现一个协议的方法:

#import "Emp.h"

@interface SEEmp : NSObject
-(void) goutong;
@end

说明:

1.利用<>引入协议名称,如果是实现多个协议用逗号分隔(,)。

2.需要实现协议中的方法,不用在.h文件中再次定义。(goutong是扩展方法);

协议的实例化方式:

1.实例化协议的子类

SEEmp *se = [[SEEmp alloc]init];

2.多态方式的实例化

id se = [[SEEmp alloc]init];

3.类型强制转换

(SEEmp *)se

4.基于协议的多态

-(void) tinghuibao:(id)emp;

git测试修改

你可能感兴趣的:(oc-语法)