点语法:
OC中点语法的本质是方法调用,而不是直接访问成员变量
例如:
p.age = 10; //等价于[p setAge:10];
int a = p.age; //等价于[p age];
当使用点语法的时候,编译器就会展开成相应的方法
p.age = 10; 就会展开成 [p setAge:10 ];
int a = p.age; 就会展开成 [p age ];
使用注意:
#import "Person.h"
@implementation Person
- (void)setAge:(int)age
{
_age = age;
NSLog(@"setAge");
//会引发死循环
//self.age = age;
}
- (int)age
{
NSLog(@"age");
//会引发死循环
//return self.age;
}
@end
id:
万能指针(内部已经包含*),能指向任何OC对象,只能使用于OC对象 id == NSObject *
id类型的定义:
typedef struct objc_object{
class isa;
} *id;
id 在使用的时候,后面一定不要在加*
局限性:调用一个不存在的方法,编译器会马上报错
#import <Foundation/Foundation.h>
#import "Person.h"
int main()
{
Person *p = [Person new];
//万能指针,能指向\操作任何oc对象
id d = [Person new];
//id == NSObject *
//多态
NSObject *o = [Person new];
[d setAge:10];
NSLog(@"%d",[p age]);
return 0;
}
构造方法:用来初始化对象的方法(-init),是个对象方法,以 - 号开头
Person *p = [Person new];
new方法用来创建对象,实际上new方法包含两部分
完整地创建一个可用的对象:
1.分配存储空间 +alloc
2.初始化 -init
当我们在初始化对象的时候,想拥有一些固定的值,那么就需要重写构造方法(init)方法
重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值
重写构造方法的注意点:
1.先调用父类的构造方法([super init])
2.再进行子类内部成员变量的初始化
//重写 -init方法
//- (id)init
//{
// //1.一定要调用super的init方法:初始化父类中声明的一些成员变量和其他属性
// self = [super init]; //返回当前对象 self
//
// //2.如果对象初始化成功,才有必要进行接下来的初始化
// if (self != nil)
// {
// //初始化成功
// _age = 10;
// }
// //3.返回一个已经初始化完毕的对象
// return self;
//}
//以后重写构造方法就这样写:
- (id)init
{
if (self = [super init])
{
//初始化成功
_age = 10;
}
//返回一个已经初始化完毕的对象
return self;
}
init方法的执行过程分析:
自定义构造方法:
自定义构造方法的规范:
1.一定是对象方法,一定以 - 开头
2.返回值一般是id类型
3.方法名一般以initWithXXX开头
- (id)initWithAge:(int)age;
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property NSString *name;
@property int age;
/*
自定义构造方法的规范:
1.一定是对象方法,一定以减号开头
2.返回值一般是id类型
3.方法名一般是init开头
*/
- (id)initWithName:(NSString *)name;
- (id)initWithAge:(int)age;
- (id)initWithName:(NSString *)name andAge:(int)age;
@end
Person.m
<pre name="code" class="objc">#import "Person.h"
@implementation Person
- (id)initWithName:(NSString *)name
{
if (self = [super init])
{
_name = name;
}
return self;
}
- (id)initWithAge:(int)age
{
if (self = [super init])
{
_age = age;
}
return self;
}
- (id)initWithName:(NSString *)name andAge:(int)age
{
if (self = [super init])
{
_name = name;
_age = age;
}
return self;
}
@end
main.m
</pre><pre name="code" class="objc">#import <Foundation/Foundation.h>
#import "Person.h"
int main()
{
Person *p = [[Person alloc]initWithName:@"Rose"];
Person *p2 = [[Person alloc]initWithName:@"Jim" andAge:10];
return 0;
}