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

来源:互联网 发布:淘宝新店怎样打造爆款 编辑:程序博客网 时间:2024/04/29 00:10

方法一:手动编写相应的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值。


0 0
原创粉丝点击