特有语法1
---------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!----------------------------
一、利用点语法替换set方法和get方法
1.
方法调用
Student *stu = [Student new];
[stu setAge:10];
int age = [stu age];
这是set和get的对象调用方法
2、点语法
stu.age = 10;
int age = stu.age;
这就是点语法,点语法的实质还是方法调用
当使用点语法时,编译器会自动展开成相应的方法 ,即:
stu.age = 10;
相当于[stu setAge :10];
3、常见错误
- (void) setAge:(int)age {
self.age = age;// [self setAge : age]
}
- (int) age {
return self.age;// [self age]
}
self.age = age;// [self setAge : age]
}
- (int) age {
return self.age;// [self age]
}
以上代码会发生死循环;
二,作用域
局部变量、全局变量都有自己的作用域,成员变量也不例外
@private:只能在当前类的对象方法中直接访问
@protected:可以在当前类以及子类的对象方法中直接访问
@public:任何地方都可以直接访问
@package:同一个“体系内”(框架)可以访问,介于@private和@public之间
@protected:可以在当前类以及子类的对象方法中直接访问
@public:任何地方都可以直接访问
@package:同一个“体系内”(框架)可以访问,介于@private和@public之间
三、@property
用在@inteface中
用来自动生成setter和getter的声明
用@property int age;就可以代替下面的两行
用来自动生成setter和getter的声明
用@property int age;就可以代替下面的两行
- (int)age; //getter
- (void)setAge:(int)newAge; //setter
@interface Person :NSObject
{
int _age;
}
@property int age;
@end;
四、@synthesize
用在@implementation中
用来自动生成setter和getter的实现
用@synthesize age = _age;就可以代替
用来自动生成setter和getter的实现
用@synthesize age = _age;就可以代替
-(int)age{
return _age
}
-(void)newAge :(int)age{
_age = age;
}
注意:
@synthesize age = _age;
setter和getter实现中会访问成员变量_age
如果成员变量_age不存在,就会自动生成一个@private的成员变量_age
@synthesize age;
setter和getter实现中会访问成员变量age
如果成员变量age不存在,就会自动生成一个@private的成员变量age
手动实现
若手动实现了setter方法,编译器就只会自动生成getter方法
若手动实现了getter方法,编译器就只会自动生成setter方法
若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量
setter和getter实现中会访问成员变量_age
如果成员变量_age不存在,就会自动生成一个@private的成员变量_age
@synthesize age;
setter和getter实现中会访问成员变量age
如果成员变量age不存在,就会自动生成一个@private的成员变量age
手动实现
若手动实现了setter方法,编译器就只会自动生成getter方法
若手动实现了getter方法,编译器就只会自动生成setter方法
若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量
自从Xcode 4.x后,@property就独揽了@synthesize的功能。也就是说,@property可以同时生成setter和getter的声明和实现
五、id
万能指针,能指向任何OC对象,相当于NSObject *
id类型的定义
id类型的定义
typedef struct objc_object {
Class isa;
} *id;
Class isa;
} *id;
id p = [Person new]; //注意id后不加*号;
六、对象的创建原理
1.new的两部曲:
1)分配内存(+alloc)
2)初始化(-init)
2)初始化(-init)
Person *p1 = [Person alloc];
Person *p1 = [p1 init];
合成一句后:
Person *p = [[Person alloc] init];
Person *p1 = [p1 init];
合成一句后:
Person *p = [[Person alloc] init];
2,init方法的重写
在对象创建完毕后,成员变量马上就有一些默认的值
- (id)init
{
if (self = [super init])
{
_age = 10;
}
return self;
}
{
if (self = [super init])
{
_age = 10;
}
return self;
}
3、自定义的构造方法
构造方法的一些规范:
返回值是id类型
方法名都以init开头
返回值是id类型
方法名都以init开头
- (id)initWithAge:(int)age {
if (self = [super init]) {
_age = age;
}
return self;
}
if (self = [super init]) {
_age = age;
}
return self;
}
七、多文件编程
每个类分布在不同文件中
类的声明放在.h文件,类的实现放在.m文件
若想使用某个类,就包含某个类的.h声明文件
类的声明放在.h文件,类的实现放在.m文件
若想使用某个类,就包含某个类的.h声明文件
---------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!----------------------------