—-Java培训、Android培训、iOS培训、.Net培训、期待与您交流!—
一、OC字符串
字符串类型 NSString
<1>.表达方式
C语言:char *name = "itcast";
OC语言:NSString *str = @"itcast";
<2>.字符串长度
例如:“哈哈abc”
在C语言里面字符串长度是9,一个汉字算作3个字符
在OC语言里面字符串长度是5,空格也算1个长度
二、点语法
1.其实点语法的本质还是方法调用,并不是像C语言中访问成员变量
2.当使用点语法时,编译器会自动展开相应的方法,如:set方法、get方法
示例
Person *p = [Person new];
//点语法的本质还是方法调用
p.age = 20; //[p setAge:20];
int a = p.age; //[p age];
p.name = @"jim";
NSString *s = p.name;
NSLog(@"%@",s);
死循环
- (void)setAge:(int)age
{
self.age = age; //会引发死循环
}
三、成员变量
1.成员变量的作用域
分别为@public、@private、@protected、@package
2.基本认识
@public: 任何地方都可以直接访问对象的成员变量,非常不安全,一般不使用
@private: 只能在当前类的对象方法中直接访问
@protected:默认成员变量类型,可以在当前类以及子类的对象方法中直接访问
@package:只要取在同一框架中,就能直接访问对象的成员变量,介于@private和@public之间,(暂时很少用到)
注意点
<1>.间接访问就用set,get方法
<2>.@interface和@implementation中不能声明同名的成员变量
<3>.@implementation中默认是@private
<4>.@interface中默认是@protected
四、set方法和get方法的快速生成
set方法和get方法的代码重复性书写大大降低了程序员工作的效率
OC语法中使用@property和@synthetic方法大大简化了set方法和get方法的定义和声明
<1>.@property
<1>.用在@interface中
<2>.用来自动生成set方法和get方法
@property int age;
//- (void)setAge:(int)Age;
// - (int)age;
@property int height;
//- (void)setHeight:(int)height;
// - (int)height;
@property NSString *name;
<2>.@synthesize
<1>.用在implementation中
<2>.用来自动生成set方法和get方法的实现
@synthesize age = _age;
//就可以代替
- (int)age //get方法
{
return _age;
}
- (void)setAge:(int)age //set方法
{
age = _age;
}
@synthesize使用注意
如果已经使用了@property方法可以不使用@synthesize方法
<3>.手动实现
1.若手动实现了set方法,编译器就会自动生成get方法
2.若手动实现了get方法,编译器就会自动生成set方法
3.若同时实现了set和get方法,编译器就不会生成不存在的成员变量
五、万能指针
<1>.定义
万能指针能指向或操作任何OC对象,相当于NSObject *
<2>.使用
例如:id p = [Person new];
注意:id后面不要加上*号
六、构造方法
1.定义
用来初始化对象的方法,是个对象方法,减号-开头
2.作用
为了让对象创建出来,成员变量就会有一些固定的值
Person *p = [Person new];显然不能满足这个需求
3.构造方法的初步认识
<1>.调用+alloc分配存储空间
Person *p1 = [Person alloc];
<2>.调用-init进行初始化
Person *p2 = [p1 init];
<3>.合并起来可以完整的创建一个对象
Person *p3 = [[Person alloc] init];
4.重写一个init方法初始化成员变量的值
<1>.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
<2>.如果对象初始化成功,才有必要进行接下来的初始化
<3>.返回一个已经初始化完毕的对象
//重写-init方法
- (id)init
{ //1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
self = [super init]; //当前对象self
//2.如果对象初始化成功,才有必要进行接下来的初始化
if (self != nil)
{
_age = 10;
}
return self;
}
七、自定义构造方法
自定义构造方法的规范
<1>.一定是对象方法,一定以减号-开头
<2>.返回值一般是id类型
<3>.方法名一般以initWith开头
示例:
定义name和age成员变量并生成相应的构造方法和能够初始化两个成员变量的构造方法
- (id)initWithName:(NSString *)name;
- (id)initWithAge:(int)age;
- (id)initWithName:(NSString *)name andAge:(int)age;
八、分类
1.分类的作用
在不改变原来类内容的基础上,可以为类增加一些方法
2.分类的格式
<1>.分类的声明
@interface 类名(分类名称)
{
//方法声明
}
@end
<2>.分类的实现
@implementation 类名(分类名称)
{
//方法实现
}
@end
3.分类的使用注意
<1>.分类只能增加方法,不能增加成员变量
<2>.分类的方法实现中,可以访问原来声明类中的成员变量
<3>.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法使用
<4>.方法调用的优先级:分类(最后参与编译的类优先) ->原来类 -> 父类
4.分类的基本用途
如何在不改变原来类模型的前提下,给类扩充一些方法,有2种形式,继承和分类
5.分类的好处
<1>.一个庞大的类可以分模块开发
<2>.一个庞大的类可以由多个人编写,更有利于团队合作
6.类的本质
其实累也是一个对象,是Class类型的对象,简称“类对象”