这段时间比较忙,已经一个礼拜没有把学习心得及时记录下来了,看的OC核心语法与内存管理都没有来得及整理,现在把这部分知识整理一下,先来整理核心语法,这篇主要总结一下OC字符串、OC点语法、property与synthesize、id等小语法点
1.OC字符串
OC中的字符串也是对象,用指针变量来存放
#import<Foundation/Foundation.h>
int main()
{
NSString *str = @"itcast"; // 创建字符串
char *nameab = "itcast"; // c语言中的创建字符串
NSLog(@"%s",nameab);
NSLog(@"%@",str); // OC字符串的输出格式符为%@
int age = 15;
int no = 5;
NSString *name = @"jack";
NSString *newStr = [NSString stringWithFormat:@"My age is %d and no is %d and name is %@",age,no,name]; // 第二种创建方法,调用了NSString的一个类方法 stringWithFormat: 字符串由其他类型的数据组合而成
NSLog(@"%@",newStr);
int size = [name length];
NSLog(@"%d",size);
NSLog(@"%ld",[newStr length]); // 计算字符串的长度、个数,区别于内存中的字符数
return 0;
}
2.OC点语法
OC中的点语法不是直接给成员变量赋值,即不是通过成员变量名来赋值,OC中点语法的实质还是方法调用,编译器会自动将点语法转化成成员变量对应的set方法和get方法,详细使用及细节见下面代码:
#import <Foundation/Foundation.h>
@interface Person:NSObject
{
int _age;
NSString *_name;
}
- (void)setAge:(int)age;
- (int)age;<pre name="code" class="objc">- (void)setName:(NSString *)name;<pre name="code" class="objc">- (NSString *)name;
@end@implementation Person- (void)setAge:(int)age{ _age = age; NSLog(@"setAge:"); }- (int)age{ NSLog(@"age"); return _age; }- (void)setName:(NSString *)name{ _name = name;}- (NSString *)name{ return _name;}@endint main(){ Person *p = [Person new]; p.age = 10; // [p setAge:10]; 不同于p->_age = 10, 点语法的本质还是方法调用,编译器会将其转化为set方法, int a = p.age; // int a = [p age]; 将p.age转化为get方法,而调用set方法与get方法的区别为:是否赋值了 return 0;
注意点:不能在setter和getter里面再次调用自身的setter和getter,例如在上面setter代码里面写self.age = age; 在getter里面写return self.age; 这样的写法会造成死循环,不断地调用setter和getter。
3.成员变量的作用域
成员变量的作用域可以用几个关键字来限定,分别为:
@public 在任何地方都能直接访问对象的成员变量
@private 只能在当前类的对象方法中直接访问
@protected 能在当前类和子类的对象方法中直接访问,不加关键字的作用域默认为protected
@package 只要处于同一个框架中,就能直接访问对象的成员变量
对于不能直接访问的对象成员变量,就需要封装setter和getter来间接访问成员变量,例如private类型和protected类型的成员变量,要在main函数中访问就必须利用setter和getter,而protected类型的成员变量,可以在子类中直接访问,例如p -> age = 10;
另外需要注意的是:方法的实现里面也可以写成员变量, 默认为私有的,因为.m文件一般不会被别的文件包含,所以写@public也没有用,但是如果把.m里面的内容与main函数放在同一源文件中,写@public是有用的,但是开发中很少人这么写;方法的实现里面的成员变量不能与@interface中重名
4.@property和@synthesize
对于每个成员变量都封装setter和getter,成员变量一多,代码的重复性太大,繁琐;所以利用@property和@synthesize 来自动声明和实现成员变量的setter和getter。
@property可以自动生成某个成员变量的setter和getter的声明,用在@interface中;对于同类型的成员变量,可以合并写成:@property int age,no;
@property int age; 注意age不要加下划线 ,否则不符合setter和getter的命名规范,也会影响点语法的使用,此语句相当于:- (void)setAge:(int)age; - (int)age;
@synthesize 可以自动生成某个成员变量的setter和getter的实现,并且访问成员变量,用在@implementation中
@synthesize age = _age; _age是要访问的成员变量,如果在@interface中不存在成员变量,即没有声明成员变量,系统会自动生成@private类型的_age成员变量;如果写成@synthesize age; 会默认访问age这个成员变量,没有自动生成
随着Xcode的发展,可以利用@property声明成员变量,访问成员变量, 又可以声明跟实现setter、getter,实际的项目开发都写成下面这样,例如:
@interface Person:NSObject
@property int age;
@end
但是如果在实现里开发自己写了setter 和getter,property不帮你生成不存在的成员变量;只要一个没有自己写,setter或者getter,property就会帮忙自动生成。
5.id
id是一种数据类型,万能指针,能操作任何的OC对象,定义在NSObject中,typedef声明中是指针类型,自带*,不能写*id
@interface Person:NSObject
@property int age;
@property id obj;
@end
@implementation Person
@end
int main()
{
Person *p = [Person new];
NSObject *o = [Person new];
id d = [Person new];
d.age = 10;
NSLog(@"%d",d.age);
d.obj = @"12131312";
NSLog(@"%@",d.obj);
return 0;
}