一、点语法
Person.h文件
@interface Person : NSObject
{
int _age;
NSString *_name;
}
- (void)setAge:(int)age;
- (int)age;
- (void)setName:(NSString *)name;
- (NSString *)name;
@end
Person.m文件
#import "Person.h"
@implementation Person
- (void)setAge:(int)age
{
//_age = age;
NSLog(@"setAge:");
// 会引发死循环
//self.age = age; // [self setAge:age];
}
- (int)age
{
NSLog(@"age");
return _age;
// 会引发死循环
//return self.age;// [self age];
}
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}
@end
main.m文件
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
Person *p = [Person new];
// 点语法的本质还是方法调用
p.age = 10; // [p setAge:10];
int a = p.age; // [p age];
p.name = @"Jack";
NSString *s = p.name;
NSLog(@"%@", s);
return 0;
}
二、成员变量的作用域
@public : 在任何地方都能直接访问对象的成员变量
@private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private)
@protected : 可以在当前类及其子类的对象方法中直接访问 (@interface中默认就是@protected)
@package : 只要处在同一个框架中,就能直接访问对象的成员变量
@interface和@implementation中不能声明同名的成员变量
三、property和synthesize
Person.h文件
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
// int age;
int _height;
double _weight;
NSString *_name;
}
// @property:可以自动生成某个成员变量的setter和getter声明
@property int age;
//- (void)setAge:(int)age;
//- (int)age;
@property int height;
//- (void)setHeight:(int)height;
//- (int)height;
- (void)test;
@property double weight;
@property NSString *name;
@end
Person.m文件
#import "Person.h"
@implementation Person
// @synthesize自动生成age的setter和getter实现,并且会访问_age这个成员变量
@synthesize age = _age;
@synthesize height = _height;
@synthesize weight = _weight, name = _name;
@end
1.@property
用在@interface中
用来自动生成setter和getter的声明
用@property int age;就可以代替下面的两行
-(int)age; // getter
- (void)setAge:(int)age; //setter
示例
#import <Foundation/Foundation.h>
@inrterface Student : NSObject {
@property int age;
}
2.@synthesize
用在@implementation中
用来自动生成setter和getter的实现
用@syuthesize age = _age;就可以代替
-(int)age{
return _age;
}
-(viod)setAge:(int)age{
_age = age;
}
示例
#imoprt“Studenth”
@implementation Student
@synthesize age = _age;
@end
3. @synthesize的细节
@synthesize age = _age
setter和getter实现中会访问成员变量 _age
如果成员变量 _age不存在,就会在@implementation中自动生成一个@private的成员变量 _age
@synthesize age
setter和getter实现中会访问成员变量age
如果成员变量age不存在,就会自动生成一个@private的成员变量age
手动实现
若手动实现了setter方法,编译器就只会自动生成getter方法
若手动实现了getter方法,编译器就只会自动生成setter方法
若手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量
综上所述创建实例代码分析:
@propery int age;
这个代码主要有三个作用:
1> 在.h头文件中生成age的setter和getter方法的声明;
2> 在.m实现文件中生成@synthesize age = _age;然后再解析成setter和getter方法的实现。
3> 在对其第二步解析的同时,由于没有找到_age的成员变量,所以会生成_age的成员变量,再在setter和getter的实现方法中访问。
4.@property新特性
自从Xcode4.4后,@property就独揽了@synthesize的功能,也就是说,@property可以同时
生成setter和getter的声明和实现
默认情况下,setter和getter方法中的实现,会去访问下划线 _ 开头的成员变量
四、万能指针
1. 简介
万能指针,能指向任何OC对象,相当于NSObject *
id类型的定义
typedef struct objc_object {
Class isa;
} *id;
2. 使用
// 注意:id后面不要加上*
id p = [Person new];
3. 局限性
调用一个不存在的方法,编译器会马上报错
五、构造函数
1. 对象创建原理
new的拆分两部曲
分配内存(+alloc)
初始化(-init)
Person *p1 = [Person alloc];
Person *p1 = [p1 init];
合成一句后:
Person *p = [[Person alloc] init];
2. init方法的重写
想在对象创建完毕后,成员变量马上就有一些默认的值
init方法的重写过程
- (id)init
{
if (self = [super init])
{
_age = 10;
}
return self;
}
3. 自定义构造方法
3.1构造方法的一些规范
返回值是id类型
方法名都以init开头
- (id)initWithAge:(int)age {
if (self = [super init]) {
_age = age;
}
return self;
}
3.2传递多个参数进行初始化
- (id) initWithAge:(int)age andNo:(int)no;