您的位置:首页 > 运维架构

OC - Property

2015-08-14 20:12 537 查看
<main.m>
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Teacher.h"
#import "Student.h"
int main(int argc, const char * argv[])
{

@autoreleasepool {

//创建 person 对象
Person *per = [Person  personWithName:@"zhangsan" sex:@"male" age:20];
//调用
[per setName:@"dafenqi"];
[per setSex:@"?"];
[per setAge:18];
NSLog(@"%@",per);

//创建 teacher 对象
Teacher *tea = [Teacher teacherWithName:@"lei" sex:@"male" age:26];

[tea setName:@"haha"];
[tea setSex:@"???"];
[tea setAge:18];
NSLog(@"%@",tea);

//*************************** 点语法 ********************************************

//创建学生对象
Student *stu = [Student studentWithName:@"dalaoliu" sex:@"male" age:18 number:@15];

//使用点语法

stu.sex = @"男";
stu.age = 21;

NSLog(@"%@,%@ ,%ld,%@",stu.name,stu.sex,stu.age,stu.number);

//*************************** KVC ********************************************

Student *stu1 = [[Student alloc ] init];

//使用 KVC强制访问 stu1 的实例变量
[stu1 setValue:@"蛋蛋" forKey:@"_name"];
NSLog(@"%@",stu1.name);
[stu1 setValue:@"男" forKey:@"_sex"];
NSLog(@"%@",[stu1 valueForKey:@"_sex"]);

//如果没有对应的实例变量
//通过 KVC 设置值 需要重写 setValue:forUndefinedKey:
[stu1 setValue:@190 forKey:@"_weight"];
//通过 KVC 取值 需要重写 valueForUndefinedKey:
NSLog(@"%@",[stu1 valueForKey:@"_weight"]);

//
//        //通过字典给对象实例变量赋值
//        NSDictionary *dataDic = [NSDictionary dictionaryWithObjectsAndKeys:@"jinpeng",@"name",@"nan",@"sex",@10012,@"number", nil];
//        NSLog(@"%@",dataDic);
//
//        [stu1 setValuesForKeysWithDictionary:dataDic];
//        [stu1 sayHi];
//
//
//
//     //创建 teacher 对象
//        stu1.teacher = [[Teacher alloc ]init];
//
//      //给学生中老师实例变量 的实例变量name赋值
//
//        [stu1 setValue:@"西兰花" forKeyPath:@"teacher.name"];
//        NSLog(@"%@",[stu1 valueForKeyPath:@"teacher.name"]);
//
//
//

}
return 0;
}


<Person.h>

#import <Foundation/Foundation.h>

@interface Person : NSObject

//{
//    NSString *_name;
//    NSString *_sex;
//    NSInteger _age;
//}

-(id)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age;

+(Person *)personWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age;

/*
1.属性: OC 2.0之后出现的语法形式,快速帮助我们生成 setter 和 getter 方法的声明;
2.属性的定义: @property NSString *name;
@property  关键字
NSString *  数据类型
name  属性名
即 @property + 数据类型 + 属性名
3.生成了 setter 和 getter 方法,即 name: 和 name

*/

@property NSString *name;
//-(void)setName:(NSString *)name;
//-(NSString *)name;

@property NSString *sex;
//-(void)setSex:(NSString *)sex;
//-(NSString *)sex;

@property NSInteger age;
//-(void)setAge:(NSInteger)age;
//-(NSInteger)age;

-(NSString *)description;

@end


<Person.m>

#import "Person.h"

@implementation Person

-(id)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
{
if ([super init]) {
_name =name;
_sex = sex;
_age = age;
}return self;
}

+(Person *)personWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
{
return [[Person alloc] initWithName:name sex:sex age:age];
}
/*   @synthesize  完成属性是实现
@synthesize 1.实现了属性的name,age,sex
2.规定了该属性声明的 setter getter 方法所操作的实例变量
3.如果@ synthesize 省略不写,则自动生成对应属性的 setter 和 getter 方法,默认操作的实例变量是属性名+'_'
4.检测对应的实例变量,如果没有找到认为生成的实例变量,则会自动生成对应的实例变量('_' + 属性名)
5.如果我们重写 setter 和 getter 方法的实现,那么@ synthesize 就不会在时下对应的 stter 和 getter 方法也就不会检测实例变量是否存在,也就不会帮助我们生成对应的实例变量,则需要我们自己添加实例变量
*/

//@synthersize 写在@ interface 里面, 该语句也可以不写,不写就是默认的
@synthesize name = _name ,age = _age ,sex = _sex;
//代表所有 setter 和 getter 方法的实现

//-(void)setName:(NSString *)name
//{
//    _name = name;
//
//}
//-(NSString *)name
//{
//    return _name;
//}
//
//-(void)setSex:(NSString *)sex
//{
//    _sex = sex;
//}
//-(NSString *)sex
//{
//    return _sex;
//}
//
//-(void)setAge:(NSInteger)age
//{
//    _age = age;
//
//}
//-(NSInteger)age
//{
//    return _age;
//}

-(NSString *)description
{
return [NSString stringWithFormat:@"name:%@,sex:%@,age:%ld",_name,_sex,_age];
}

@end


<Teacher.h>

#import <Foundation/Foundation.h>

@interface Teacher : NSObject
{
NSString *_name;
NSString *_sex;
NSInteger _age;
NSNumber *_number;
}
/**
属性的属性:
1.读写特性
(1)readwrite (可读可写)默认属性,既生成setter方法,又生成gette方法
(2)readonly (只读),只生成getter方法,不会生成setter方法
(3)setter = 方法名,给生成的setter方法起一个其他的方法名
(4)getter = 方法名,给生成的getter方法起一个其他的方法名

2.原子特性
(1)atomic (原子特性)默认属性,保证线程安全,也就是当前的实例变量只能由一个线程访问,在这个过程中有一个加锁解锁的过程
(2)nonatomic (非原子特性),不会保证线程安全,但是一般情况下没有任何问题,而且执行效率远远高于 atomic, 又因为我们会频繁的访问实例变量,所以苹果官方推荐使用 nonatomic

3.语义特性
(1)assign 默认属性,一般用来修饰非对象类型的属性
(2)retain 针对于对象,会将对象的引用计数+1
(3)copy 针对于对象,将对象拷贝一份,产生一个新的对象
//注: 一般的 NSString为数据类型的时候需要为其属性添加copy的属性,其他对象添加retain属性

*/

@property (nonatomic,copy)NSString *name;
@property (nonatomic,copy)NSString *sex;
@property (nonatomic)NSInteger age;
@property (nonatomic,retain)NSNumber *number;

-(id)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age;

+(Teacher *)teacherWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age;
-(NSString *)description;

@end


<Teacher.m>

#import "Teacher.h"

@implementation Teacher

-(id)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
{
if ([super init]) {
_name = name;
_sex = sex;
_age = age;
}return self;
}

+(Teacher *)teacherWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
{
return [[Teacher alloc]initWithName:name sex:sex age:age];
}

-(NSString *)description
{
return [NSString stringWithFormat:@"name:%@,sex:%@,age:%ld",_name,_sex,_age];
}

//copy 下的 setter getter 实现
-(void)setName:(NSString *)name
{
if (name != _name) {
[_name release];
_name = [name copy];
}
}

-(NSString *)name
{
return _name ;
}

//retain 下的 setter getter 实现
-(void)setNumber:(NSNumber *)number
{
if (_number != number) {
[_number release];
_number = [number retain];
}
}

-(NSNumber *)number
{
return _number ;
}

//assign 下的 setter 和 getter
-(void)setAge:(NSInteger)age
{
_age = age;
}

-(NSInteger)age
{
return _age;
}

@end


<Student.h>

#import <Foundation/Foundation.h>
#import "Teacher.h"
@interface Student : NSObject
{
NSString *_name;
NSString *_sex;
NSInteger _age;
NSNumber *_number;
}

@property (nonatomic,copy)NSString *name;
@property (nonatomic,copy)NSString *sex;
@property (nonatomic)NSInteger age;
@property (nonatomic,retain)NSNumber *number;
@property (nonatomic,retain)Teacher *teacher;

//初始化
-(id)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger )age
number:(NSNumber *)number;

//构造器
+(Student *)studentWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
number:(NSNumber *)number;

-(void)sayHi;

@end


<Student.m>

#import "Student.h"

@implementation Student

-(id)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger )age
number:(NSNumber *)number
{
if ([super init]) {
self.name = name;   //[self setName:name]
self.sex = sex;
self.age = age;
self.number = number;
}return self;
}

+(Student *)studentWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
number:(NSNumber *)number
{
return [[Student alloc ] initWithName:name sex:sex age:age number:number];
}

-(void)sayHi
{
NSLog(@"name:%@,sex:%@,age:%ld,number:%@",_name,_sex,_age,_number);
}

//setter  getter

-(void)setName:(NSString *)name
{
if (_name != name) {
[_name release];
_name = [name copy];
}
}

-(NSString *)name
{
return _name;
}

-(void)setSex:(NSString *)sex
{
if (_sex != sex) {
[_sex release];
_sex = [sex copy];
}
}

-(void)setAge:(NSInteger)age
{
_age = age;

}

-(NSInteger)age
{
return _age;
}

-(void)setNumber:(NSNumber *)number
{
if (_number != number) {
[_number release];
_number = [number retain];
}
}

-(NSNumber *)number
{
return _number;
}

-(void)setValue:(id)value forUndefinedKey:(NSString *)key
{
NSLog(@"没有对应的实例变量key:%@",key);
}

-(id)valueForUndefinedKey:(NSString *)key
{
NSLog(@"没有对应 key:%@",key);
return nil;
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: