OC学习笔记5
A. 变量的可见性
类型:
@private:只能在当前类的对象方法中直接访问
@protected:可以在当前类以及子类的对象方法中直接访问
@public:任何一个地方都可以访问
@package:同一个“体系内”(框架)可以访问,介于@private和@public之间
B. @property
a.用在@interface中
b.用来自动生成setter和getter的声明
C.用@property int age;就可以代替下面的两行
- (int)age; // getter
- (void)setAge:(int)age; // setter
@property示例
C.@synthesize
a.用在@implementation中
b.用来自动生成setter和getter的实现
c.用@synthesize age = _age;就可以代替
- (int)age{
return _age;
}
- (void)setAge:(int)age{
_age = age;
}
@synthesize示例
D. @synthesize的细节
@synthesize age=_age;
a. Setter和getter实现中会访问成员变量_age;
b. 如果成员变量_age不存在,就会自动生成一个@private的成员变量
C. @synthesize age;
Setter和getter 实现中会访问成员变量age;
如果成员变量age不存在,就会自动生成一个@private的成员变量age
手动实现
若手动实现了setter方法,编译器就只会自动生成getter方法
若手动实现了getter方法,编译器就只会自动生成setter方法
若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量
@property新特性
新版本的Xcode中@property独揽了@synthesize的功能,@property可以同时生成setter和getter的声明和实现
默认情况下,setter和getter方法中的实现,会访问下划线_开头的成员变量
万能指针 id 简介
万能指针,指向任何OC对象,相当于NSObject *
Id类型定义
typedef struct objc_object {
Class isa;
} *id;
使用
//注意:id 后面不要加上*
Id p=[Person new];
局限性
掉用一个不存在的方法,编译器会马上报错
对象创建原理
New的拆分两部曲
A.分配内存(+alloc)
B.初始化(-init)
C.示例
Person *p1 = [Person alloc];
D.Person *p1 = [p1 init];
E.合成一句后:
F.Person *p = [[Person alloc] init];
Init方法的重写过程
- (id)init
{
if (self = [super init])
{
_age = 10;
}
return self;
}
自定义构造方法
构造方法的一些规范
A.返回值是id类型
B.方法名都以init开头
- (id)initWithAge:(int)age {
if (self = [super init]) {
_age = age;
}
return self;
}