运行XCode5.1,创建项目,OSX版,CommanLineTool。完成后,新建文件,OSX,Cocoa,ObjectC-Class。以下测试在终端使用cc命令会报警,但运行无错。
1)h文件
- end
1.隐式setter和getter的自动完成
1)h文件
#import <Foundation/Foundation.h>
@interface Persion : NSObject
/**使用 @property 代替以前的{}声明对象属性方式。但实质上还是这样创建的,有XCode自动隐式完成。4.x版本的XCode隐式创建时,属性名是默认带“_”的,本文5.1版本XCode默认没有下划线前缀。
{
int age;
NSString * name;
}
**/
@property int age; //默认是private
@property NSString * name; //private
/**使用@property创建的属性会自动创建setter和getter的声明
- (void) setAge:(int)age;
- (int)age;
- (void) setName:(NSString *)name;
- (NSString *)name;
**/
//------------其它方法--------------
- (NSString *) toString;
@end
2)m文件
#import "Persion.h"
@implementation Persion
/**使用 @synthesize 自动实现setter和getter**/
@synthesize age; //这一句也不是必须的。只有在@interf中使用了@property即可,除非你需要改变操作的属性(成员变量)。
@synthesize name;
//@synthesize age, name;
/**因为使用了 @synthesize,以下代码冥冥中自动完成了
- (void) setAge:(int)age{
self->age = age;
}
- (int)age{
return self->age;
}
- (void) setName:(NSString *)name{
self->name = name;
}
- (NSString *)name{
return self->name;
}
**/
//------------其它方法--------------
- (NSString *) toString{
return [NSString stringWithFormat:@"年龄:%d,姓名:%@", age, name];
}
@end
3)main
#import <Foundation/Foundation.h>
#import "Persion.h"
int main(int argc, const char * argv[])
{
Persion * p = [Persion new];
//使用.点方法访问对象的属性。这和Java、C#中的点方法绝对是两回事
//如果是赋值,本质还是调用setter
p.age = 43;
p.name = @"Eminm";
NSLog(@"Persion,%@", [p toString]);
//使用点方法。如果是调用,本质还是getter
NSLog(@"Persion的Name:%@", p.name);
}
2.预定义属性和隐式getter、setter
1)h文件
#import <Foundation/Foundation.h>
@interface Animal : NSObject
//如果有须要仍然这样声明了对象属性
{
NSString * _name;
}
//并且想自动声明属性的setter和getter
//因为m文件中的@synthesize配置name=_name,这里并未隐式的声明name属性。这个name即指向了_name
@property NSString * name;
- (NSString *) toString;
@end
2)m文件
#import "Animal.h"
@implementation Animal
//指定操作的成员变量
@synthesize name = _name;
/** 隐式完成的内容:
- (void) setName:(NSString *)name{
_name = name;
}
- (NSString *)name{
return _name;
}
**/
- (NSString *) toString{
return [NSString stringWithFormat:@"%@", _name];
}
@end
3)main
#import <Foundation/Foundation.h>
#import "Animal.h"
int main(int argc, const char * argv[])
{
Animal * animal = [Animal new];
animal.name = @"Chihuahua";
NSLog(@"Aniaml,%@", [animal toString]);
}
3.隐式的属性定义
1)h文件
#import <Foundation/Foundation.h>
@interface Plant : NSObject
@property NSString * name;
/**
当前Xcode版本为5.1。这一功能从4.3开始
上一句代码做了3件事
1.声明了成员变量_name
2.声明了setter和getter
3.在.m中实现了setter和getter
所以,仅一个声明,XCode就自动完成了一系列代码实现
**/
@end
2)m文件
#import "Plant.h"
@implementation Plant
/** 这里什么也不用做
由XCode自动完成@synthesize name = _name;
即完成实现_name的setter和getter
**/
@end
3)main
#import <Foundation/Foundation.h>
#import "Plant.h"
int main(int argc, const char * argv[])
{
Plant * plant = [Plant new];
/** 实质还是调用XCode隐式自动实现的set方法 **/
plant.name = @"兰草";
/** 实质还是调用XCode隐式自动实现的get方法 **/
NSLog(@"植物:%@", plant.name);
}
4.隐式实现原则
#import <Foundation/Foundation.h>
@interface Plant : NSObject
@property NSString * name;
@end
@implementation Plant
/**
XCode在编译时,有则使用,无则创建
这里有了一个getter,那么就拿来用
**/
- (NSString *) name{
return @"HelloProperty";
}
@end
int main(int argc, const char * argv[])
{
Plant * plant = [Plant new];
plant.name = @"兰草";
NSLog(@"植物:%@", plant.name); //植物:HelloProperty
}
- end