您的位置:首页 > 移动开发 > Objective-C

Objective-C设置修改对象属性方法总结

2015-05-14 10:08 337 查看
方法一:手动编写相应的set和get方法

//  Person.h
#import <Foundation/Foundation.h>

@interface Person : NSObject
{
//声明一个变量
int myNumber;
}
-(int)myNumber;   //get方法
-(void)setMyNumber:(int)_number;  //set方法
-(void)printf;
@end

//  Person.m
#import "Person.h"

@implementation Person

-(int)myNumber{
return  myNumber;
}
-(void)setMyNumber:(int)_number{
myNumber=_number;
}-(void)printf{
NSLog(@"myNumber is %d\n",myNumber);
}
@end

方法2:使用@property和@synthesize指令合成存取方法

//  Person.h
#import <Foundation/Foundation.h>

@interface Person : NSObject
{
//声明一个变量
int myNumber;
}
@property(nonatomic)int myNumer; //这样声明之后,会动态创建
-(void)printf;
@end

//  Person.m

#import "Person.h"

@implementation Person

@synthesize myNumer;  //自动合成
-(void)printf{
NSLog(@"myNumber is %d\n",myNumber);
}
@end


方法三:使用点语法访问

在对象存在setter方法时,无论对象是否存在相应的成员变量,程序都可以通过点语法来设置对象的属性。同样的,只要该对象有getter方法,无论对象是否存在相应的成员变量,程序可以通过点语法来获取属性值。(注意区分 成员变量 和 属性 这是两个不同的东西)

//main.c

#import"Person.h"

int main(int argc,char*argv[]){

@atuoreleasepool{

Person *person=[[Person alloc]init];

person.myNumber=10;

NSLog(@"person.myNumber");

}

}

方法四:键值编码(KVC: key Value Coding )

KVC允许以字符串形式间接操作对象的属性。由NSKey ValueCoding协议提供支持。最基本的操作属性的两个方法:

setValue:属性值 forKey:属性名:
为指定属性设置值

valueForKey:属性名 :
获取指定的属性的值

//main.c

#import"Person.h"

int main(int argc,char*argv[]){

@atuoreleasepool{

Person *person=[[Person alloc]init];

[person setValue:@"123" forKey:@"myNumber"];

NSLog(@"%i",[person valueForKey:@"myNumber"]);

}

}

下面深层解析一下setValue底层执行机制

(1)程序优先考虑调用 “setName:属性值”,代码通过setter方法完成设置。

(2)如果没有setName方法,KVC机制会搜索该类中名为 _name 的成员变量,然后对其赋值。与成员变量在什么地方(接口部分还是实现部分)申明没有关系,与访问控制修饰符无关。

(3)如果前两者都没有,KVC会去搜索名为 name的成员变量(与定义位置无关),与访问控制修饰符无关。

(4)如果上面三步都没有,系统会执行 setValue:forUNdefinedKey:方法,引发一个异常(NSUnknownKeyException),导致程序结束。

我们可以重写 setValue:forUNdefinedKey:方法,输出警告信息等。

valueForKey:@“name”执行顺序同setValue。

KVC除了可以操作对象的属性之外,还可以操作对象的“复合属性”,所谓的“复合属性”,KVC机制将其称为Key路径,如 item.name.

提供了两个方法:

setValue:forKeyPath:

valueForKeyPath:

[person setValue:@"456" forKeyPath:@"leg.length"]; //设置Person对象中leg属性的length值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐