一、点语法
1、方法示例
Person *p = [Person new];
[p setAge:20];
int age = [p age];
可以用点语法替换set和get方法
p.age=20;
int age = p.age;
2、点语法本质
例如当编译器遇到p.age=20;会转换为相应的set方法[p setAge:20]; 所以点语法其实还是方法调用,这是编译器的一种特性。
注:p.age=20;不是访问成员变量
3、死循环
注意下面的set和get写法,会引起死循环
- (void)setAge:(int)age
{
Self.age = age;
}
- (int)age
{
return self.age;
}
二、成员变量的作用域
成员变量也有其使用范围,分为四种类型
- @private:私有,只能在当前类的实现直接访问
- @protected:被保护,默认类型,可以在当前类以及子类的实现中访问
- @public:公共,任何地方都可以直接访问对象的成员变量
- @package:只要处在同一个框架中,就可以访问对象的成员变量
注:某一类型后的成员变量都为该类型
示例:
@public
int _age;
int _weight;
@protected
int _num;
其中age、weight为@public类型,num为@protected类型
三、@property和@synthesize
@property和@synthesize都是Objective-C的关键字,用来生成成员变量的setter和getter声明和实现。
1、@property
示例:
#import <Foundation/Foundation.h>
@interface person : NSObject
{
int _age;
}
- (void)setAge:(int)age;
- (int)age; //
@end
以上代码可以改写为
#import <Foundation/Foundation.h>
@interface person : NSObject
{
int _age;
}
@property int age;
@end
- 用在@interface和@end之间,可以自动生成某个成员变量的setter和getter声明
- 用@property int age;可以代替下面两行代码
- (void)setAge:(int)age; // setter方法
- (int)age; // getter方法
2、@synthesize
示例:
#import"person.h"
@implementation Person
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
@end
以上代码可以改写为
#import"person.h"
@implementation Person
@synthesize age=_age;
@end
- l 用在@implementation和@end之间,以自动生成成员变量setter和getter的实现
- l 用@synthesize age=_age; 可以代替以下代码
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
3、@synthesize细节
(1)@synthesize age=_age;
- 会自动生成age的setter和getter实现,并且会访问_age这个成员变量
- 如果成员变量_age不存在,会.m文件中生成@private类型的成员变量_age
(2)@synthesize age;
- setter和getter实现时访问age这个成员变量(不是_age)
- 如果age不存在,会自动生成@private类型的age变量
(3)若已手动实现setter或getter方法,编译器就不会再生成该方法,只生成另外一个不存在的方法(若成员变量不存在也会生成)。
4、最简写法
XCode4.5及以后版本,@property具有@synthesize的功能,@synthesize可以省略,也就是说@property可以同时生成setter和getter的声明和实现,默认访问以下划线_开头的成员变量。
@interface person : NSObject
@property int age;
@end
四、id
1、类型定义
typedf struct objc_object{
Class isa;
} *id;
- id为万能指针,可以指向任何类型的OC对象,相当于NSObject *
2、使用示例:
id d = [Person new];
[d setAge:20]
NSLog(@”%d”,[d age]);
- 使用时id后面不再加*