- 浏览: 662611 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
lizaochengwen:
网络请求碰到的中文乱码使用encodeURL吧- (NSStr ...
iPhone开发/iPad开发 中文乱码问题 -
hhb19900618:
还是没弄懂怎么解决了中文乱码? 正确代码能重写贴出吗
iPhone开发/iPad开发 中文乱码问题 -
zhengjj_2009:
我的理解是讲ipa文件解压缩之后再重新打包,已经破坏了签名,所 ...
xcodebuild和xcrun实现自动打包iOS应用程序 -
zhengjj_2009:
我参考你的“ 从ipa格式的母包生成其它渠道包的shell脚本 ...
xcodebuild和xcrun实现自动打包iOS应用程序 -
同一片天空:
问题果然解决了
iOS 搭建 XMPP实现环境
原文地址:http://marshal.easymorse.com/tech/objc-使用kvc
KVC是什么?即:Key-Value Coding,直译是:键值编码。
还是没明白什么意思?先看看下面的代码。
Book类的代码,头文件:
#import <Foundation/Foundation.h>
@interface Book : NSObject {
NSString *name;
}
@end
实现文件:
#import "Book.h"
@implementation Book
@end
这个Book类太简单了,只有一个实例变量name。而且,按照以前掌握的技术,没有办法给这个变量赋值了。
下面KVC登场,在main方法中给Book实例的name属性赋值并获取该属性的值:
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Book *book=[[Book alloc] init];
[book setValue:@"《Objective C入门》" forKey:@"name"];
NSString *name=[book valueForKey:@"name"];
NSLog(@"book name: %@",name);
[pool drain];
return 0;
}
这里会发现ObjC的KVC很类似Java中通过反射得到类实例变量的方式。比如valueForKey方法先尝试在Book实例上找getName方法,如果找到就调用。如果没有找到,则查找实例是否有name变量或者_name变量。如果还没找到,会抛出类似下面的异常:
Terminating app due to uncaught exception ‘NSUnknownKeyException’, reason: ‘[<Book 0x10010c730> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name1.’
下面把代码做一点修改,首先创建了个新类Author,图书的作者,头文件:
#import <Cocoa/Cocoa.h>
@interface Author : NSObject {
NSString *name;
}
@end
也有个name属性,表示作者的姓名。实现文件什么也没写:
#import "Author.h"
@implementation Author
@end
然后,将author属性添加到Book类中,即每个Book实例都有一个author属性。头文件:
#import <Foundation/Foundation.h>
@class Author;
@interface Book : NSObject {
NSString *name;
Author *author;
}
@end
实现文件还是什么都没有:
#import "Book.h"
@implementation Book
@end
在main方法中,通过kvc方式获取book的author的name属性:
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Book *book=[[[Book alloc] init] autorelease];
[book setValue:@"《Objective C入门》" forKey:@"name"];
NSString *name=[book valueForKey:@"name"];
NSLog(@"book name: %@",name);
Author *author=[[[Author alloc] init] autorelease];
[author setValue:@"Marshal Wu" forKey:@"name"];
[book setValue:author forKey:@"author"];
NSString *authorName=[book valueForKeyPath:@"author.name"];
NSLog(@"author name: %@",authorName);
[pool drain];
return 0;
}
可以看到,写法很类似JSP的EL表达式:
${book.author.name}
在ObjC的世界里叫Path,路径。当然,你也可以:
[book setValue:@"zhangsan" forKeyPath:@"author.name"];
通过路径设置属性。
KVC还有一个很重要的特点,自动装箱拆箱功能。这在ObjC中是仅有的,其他情况下均需要使用比如NSNumber来手动拆装箱的。
比如Book类头文件做了下面的增加:
#import <Foundation/Foundation.h>
@class Author;
@interface Book : NSObject {
NSString *name;
Author *author;
float price;
}
@end
实现文件还是没有动,不提了。main方法增加了对price赋值和获取值的调用,使用KVC方式:
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Book *book=[[[Book alloc] init] autorelease];
[book setValue:@"《Objective C入门》" forKey:@"name"];
NSString *name=[book valueForKey:@"name"];
NSLog(@"book name: %@",name);
Author *author=[[[Author alloc] init] autorelease];
[author setValue:@"Marshal Wu" forKey:@"name"];
[book setValue:author forKey:@"author"];
NSString *authorName=[book valueForKeyPath:@"author.name"];
NSLog(@"author name: %@",authorName);
[book setValue:@"zhangsan" forKeyPath:@"author.name"];
[book setValue:@"10.4" forKey:@"price"];
NSLog(@"book price is %@",[book valueForKey:@"price"]);
[pool drain];
return 0;
}
可以看到给price输入的是NSString类型,但是没有问题,因为KVC方式会根据字符串自动转型为适当的数值。再看打印price属性,%@是打印对象,而price属性是float基本型,这里KVC肯定做了自动装箱的处理,将基本型转为NSNumber对象。
KVC还具备对集合的操作能力。比如,图书可以有相关图书,这是个1对多的关系。可以用集合来表示,这里用NSArray表示,在Book类的头文件中改动:
#import <Foundation/Foundation.h>
@class Author;
@interface Book : NSObject {
NSString *name;
Author *author;
float price;
NSArray *relativeBooks;
}
@end
如果想得到相关图书的价格NSArray,可以使用KVC方式,见main方法:
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Book *book=[[[Book alloc] init] autorelease];
[book setValue:@"《Objective C入门》" forKey:@"name"];
NSString *name=[book valueForKey:@"name"];
NSLog(@"book name: %@",name);
Author *author=[[[Author alloc] init] autorelease];
[author setValue:@"Marshal Wu" forKey:@"name"];
[book setValue:author forKey:@"author"];
NSString *authorName=[book valueForKeyPath:@"author.name"];
NSLog(@"author name: %@",authorName);
[book setValue:@"zhangsan" forKeyPath:@"author.name"];
[book setValue:@"10.4" forKey:@"price"];
NSLog(@"book price is %@",[book valueForKey:@"price"]);
Book *book1=[[[Book alloc] init] autorelease];
[book1 setValue:@"5.0" forKey:@"price"];
Book *book2=[[[Book alloc] init] autorelease];
[book2 setValue:@"4.0" forKey:@"price"];
NSArray *books=[NSArray arrayWithObjects:book1,book2,nil];
[book setValue:books forKey:@"relativeBooks"];
NSLog(@"relative books price: %@",[book valueForKeyPath:@"relativeBooks.price"]);
[pool drain];
return 0;
}
增加的代码见黑体斜体部分。日志将打印出相关图书的价格列表:
2011-05-26 19:27:57.456 ReleaseMemoDemo[10042:a0f] book name: 《Objective C入门》
2011-05-26 19:27:57.461 ReleaseMemoDemo[10042:a0f] author name: Marshal Wu
2011-05-26 19:27:57.462 ReleaseMemoDemo[10042:a0f] book price is 10.4
2011-05-26 19:27:57.463 ReleaseMemoDemo[10042:a0f] relative books price: (
5,
4
)
KVC还能对集合做运算,比如想得到相关图书的个数、相关图书的价格总和、相关图书的平均价格、价格的最大值和价格的最小值,见下面的代码:
NSArray *books=[NSArray arrayWithObjects:book1,book2,nil];
[book setValue:books forKey:@"relativeBooks"];
NSLog(@"relative books price: %@",[book valueForKeyPath:@"relativeBooks.price"]);
NSLog(@"relative books count: %@",[book valueForKeyPath:@"relativeBooks.@count"]);
NSLog(@"relative books price sum: %@",[book valueForKeyPath:@"relativeBooks.@sum.price"]);
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@"relativeBooks.@avg.price"]);
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@"relativeBooks.@max.price"]);
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@relativeBooks.@min.price]);
相关日志:
2011-05-26 19:45:27.786 ReleaseMemoDemo[10289:a0f] relative books price: (
5,
4
)
2011-05-26 19:45:27.787 ReleaseMemoDemo[10289:a0f] relative books count: 2
2011-05-26 19:45:27.788 ReleaseMemoDemo[10289:a0f] relative books price sum: 9
2011-05-26 19:45:27.788 ReleaseMemoDemo[10289:a0f] relative books price avg: 4.5
2011-05-26 19:45:27.789 ReleaseMemoDemo[10289:a0f] relative books price avg: 5
2011-05-26 19:45:27.789 ReleaseMemoDemo[10289:a0f] relative books price avg: 4
另外,如果想获得没有重复的价格集合,可以这样:
Book *book1=[[[Book alloc] init] autorelease];
[book1 setValue:@"5.0" forKey:@"price"];
Book *book2=[[[Book alloc] init] autorelease];
[book2 setValue:@"4.0" forKey:@"price"];
Book *book3=[[[Book alloc] init] autorelease];
[book3 setValue:@"4.0" forKey:@"price"];
NSArray *books=[NSArray arrayWithObjects:book1,book2,book3,nil];
[book setValue:books forKey:@"relativeBooks"];
NSLog(@"relative books price: %@",[book valueForKeyPath:@"relativeBooks.price"]);
NSLog(@"relative books distinct price: %@",[book valueForKeyPath:@"relativeBooks.@distinctUnionOfObjects.price"]);
NSLog(@"relative books count: %@",[book valueForKeyPath:@"relativeBooks.@count"]);
NSLog(@"relative books price sum: %@",[book valueForKeyPath:@"relativeBooks.@sum.price"]);
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@"relativeBooks.@avg.price"]);
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@"relativeBooks.@max.price"]);
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@relativeBooks.@min.price]);
这里增加了book3实例,它的价格和book2相同。在使用@distinctUnionOfObjects后,发现效果是消除重复的价格:
011-05-26 19:55:41.123 ReleaseMemoDemo[10378:a0f] book price is 10.4
2011-05-26 19:55:41.124 ReleaseMemoDemo[10378:a0f] relative books price: (
5,
4,
4
)
2011-05-26 19:55:41.124 ReleaseMemoDemo[10378:a0f] relative books distinct price: (
4,
5
)
KVC还可以在一个语句中为实例的多个属性赋值:
Book *book4=[[Book alloc] init];
NSArray *bookProperties=[NSArray arrayWithObjects:@"name",@"price",nil];
NSDictionary *bookPropertiesDictionary=[book4 dictionaryWithValuesForKeys:bookProperties];
NSLog(@"book values: %@",bookPropertiesDictionary);
NSDictionary *newBookPropertiesDictionary=[NSDictionary dictionaryWithObjectsAndKeys:@"《Objective C入门》",@"name",
@"20.5",@"price",nil];
[book4 setValuesForKeysWithDictionary:newBookPropertiesDictionary];
NSLog(@"book with new values: %@",[book4 dictionaryWithValuesForKeys:bookProperties]);
另外,还有两个比较高级的内容:
nil和覆盖setNilValueForKey方法
覆盖valueForUndefinedKey方法
KVC是什么?即:Key-Value Coding,直译是:键值编码。
还是没明白什么意思?先看看下面的代码。
Book类的代码,头文件:
#import <Foundation/Foundation.h>
@interface Book : NSObject {
NSString *name;
}
@end
实现文件:
#import "Book.h"
@implementation Book
@end
这个Book类太简单了,只有一个实例变量name。而且,按照以前掌握的技术,没有办法给这个变量赋值了。
下面KVC登场,在main方法中给Book实例的name属性赋值并获取该属性的值:
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Book *book=[[Book alloc] init];
[book setValue:@"《Objective C入门》" forKey:@"name"];
NSString *name=[book valueForKey:@"name"];
NSLog(@"book name: %@",name);
[pool drain];
return 0;
}
这里会发现ObjC的KVC很类似Java中通过反射得到类实例变量的方式。比如valueForKey方法先尝试在Book实例上找getName方法,如果找到就调用。如果没有找到,则查找实例是否有name变量或者_name变量。如果还没找到,会抛出类似下面的异常:
Terminating app due to uncaught exception ‘NSUnknownKeyException’, reason: ‘[<Book 0x10010c730> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name1.’
下面把代码做一点修改,首先创建了个新类Author,图书的作者,头文件:
#import <Cocoa/Cocoa.h>
@interface Author : NSObject {
NSString *name;
}
@end
也有个name属性,表示作者的姓名。实现文件什么也没写:
#import "Author.h"
@implementation Author
@end
然后,将author属性添加到Book类中,即每个Book实例都有一个author属性。头文件:
#import <Foundation/Foundation.h>
@class Author;
@interface Book : NSObject {
NSString *name;
Author *author;
}
@end
实现文件还是什么都没有:
#import "Book.h"
@implementation Book
@end
在main方法中,通过kvc方式获取book的author的name属性:
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Book *book=[[[Book alloc] init] autorelease];
[book setValue:@"《Objective C入门》" forKey:@"name"];
NSString *name=[book valueForKey:@"name"];
NSLog(@"book name: %@",name);
Author *author=[[[Author alloc] init] autorelease];
[author setValue:@"Marshal Wu" forKey:@"name"];
[book setValue:author forKey:@"author"];
NSString *authorName=[book valueForKeyPath:@"author.name"];
NSLog(@"author name: %@",authorName);
[pool drain];
return 0;
}
可以看到,写法很类似JSP的EL表达式:
${book.author.name}
在ObjC的世界里叫Path,路径。当然,你也可以:
[book setValue:@"zhangsan" forKeyPath:@"author.name"];
通过路径设置属性。
KVC还有一个很重要的特点,自动装箱拆箱功能。这在ObjC中是仅有的,其他情况下均需要使用比如NSNumber来手动拆装箱的。
比如Book类头文件做了下面的增加:
#import <Foundation/Foundation.h>
@class Author;
@interface Book : NSObject {
NSString *name;
Author *author;
float price;
}
@end
实现文件还是没有动,不提了。main方法增加了对price赋值和获取值的调用,使用KVC方式:
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Book *book=[[[Book alloc] init] autorelease];
[book setValue:@"《Objective C入门》" forKey:@"name"];
NSString *name=[book valueForKey:@"name"];
NSLog(@"book name: %@",name);
Author *author=[[[Author alloc] init] autorelease];
[author setValue:@"Marshal Wu" forKey:@"name"];
[book setValue:author forKey:@"author"];
NSString *authorName=[book valueForKeyPath:@"author.name"];
NSLog(@"author name: %@",authorName);
[book setValue:@"zhangsan" forKeyPath:@"author.name"];
[book setValue:@"10.4" forKey:@"price"];
NSLog(@"book price is %@",[book valueForKey:@"price"]);
[pool drain];
return 0;
}
可以看到给price输入的是NSString类型,但是没有问题,因为KVC方式会根据字符串自动转型为适当的数值。再看打印price属性,%@是打印对象,而price属性是float基本型,这里KVC肯定做了自动装箱的处理,将基本型转为NSNumber对象。
KVC还具备对集合的操作能力。比如,图书可以有相关图书,这是个1对多的关系。可以用集合来表示,这里用NSArray表示,在Book类的头文件中改动:
#import <Foundation/Foundation.h>
@class Author;
@interface Book : NSObject {
NSString *name;
Author *author;
float price;
NSArray *relativeBooks;
}
@end
如果想得到相关图书的价格NSArray,可以使用KVC方式,见main方法:
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Book *book=[[[Book alloc] init] autorelease];
[book setValue:@"《Objective C入门》" forKey:@"name"];
NSString *name=[book valueForKey:@"name"];
NSLog(@"book name: %@",name);
Author *author=[[[Author alloc] init] autorelease];
[author setValue:@"Marshal Wu" forKey:@"name"];
[book setValue:author forKey:@"author"];
NSString *authorName=[book valueForKeyPath:@"author.name"];
NSLog(@"author name: %@",authorName);
[book setValue:@"zhangsan" forKeyPath:@"author.name"];
[book setValue:@"10.4" forKey:@"price"];
NSLog(@"book price is %@",[book valueForKey:@"price"]);
Book *book1=[[[Book alloc] init] autorelease];
[book1 setValue:@"5.0" forKey:@"price"];
Book *book2=[[[Book alloc] init] autorelease];
[book2 setValue:@"4.0" forKey:@"price"];
NSArray *books=[NSArray arrayWithObjects:book1,book2,nil];
[book setValue:books forKey:@"relativeBooks"];
NSLog(@"relative books price: %@",[book valueForKeyPath:@"relativeBooks.price"]);
[pool drain];
return 0;
}
增加的代码见黑体斜体部分。日志将打印出相关图书的价格列表:
2011-05-26 19:27:57.456 ReleaseMemoDemo[10042:a0f] book name: 《Objective C入门》
2011-05-26 19:27:57.461 ReleaseMemoDemo[10042:a0f] author name: Marshal Wu
2011-05-26 19:27:57.462 ReleaseMemoDemo[10042:a0f] book price is 10.4
2011-05-26 19:27:57.463 ReleaseMemoDemo[10042:a0f] relative books price: (
5,
4
)
KVC还能对集合做运算,比如想得到相关图书的个数、相关图书的价格总和、相关图书的平均价格、价格的最大值和价格的最小值,见下面的代码:
NSArray *books=[NSArray arrayWithObjects:book1,book2,nil];
[book setValue:books forKey:@"relativeBooks"];
NSLog(@"relative books price: %@",[book valueForKeyPath:@"relativeBooks.price"]);
NSLog(@"relative books count: %@",[book valueForKeyPath:@"relativeBooks.@count"]);
NSLog(@"relative books price sum: %@",[book valueForKeyPath:@"relativeBooks.@sum.price"]);
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@"relativeBooks.@avg.price"]);
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@"relativeBooks.@max.price"]);
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@relativeBooks.@min.price]);
相关日志:
2011-05-26 19:45:27.786 ReleaseMemoDemo[10289:a0f] relative books price: (
5,
4
)
2011-05-26 19:45:27.787 ReleaseMemoDemo[10289:a0f] relative books count: 2
2011-05-26 19:45:27.788 ReleaseMemoDemo[10289:a0f] relative books price sum: 9
2011-05-26 19:45:27.788 ReleaseMemoDemo[10289:a0f] relative books price avg: 4.5
2011-05-26 19:45:27.789 ReleaseMemoDemo[10289:a0f] relative books price avg: 5
2011-05-26 19:45:27.789 ReleaseMemoDemo[10289:a0f] relative books price avg: 4
另外,如果想获得没有重复的价格集合,可以这样:
Book *book1=[[[Book alloc] init] autorelease];
[book1 setValue:@"5.0" forKey:@"price"];
Book *book2=[[[Book alloc] init] autorelease];
[book2 setValue:@"4.0" forKey:@"price"];
Book *book3=[[[Book alloc] init] autorelease];
[book3 setValue:@"4.0" forKey:@"price"];
NSArray *books=[NSArray arrayWithObjects:book1,book2,book3,nil];
[book setValue:books forKey:@"relativeBooks"];
NSLog(@"relative books price: %@",[book valueForKeyPath:@"relativeBooks.price"]);
NSLog(@"relative books distinct price: %@",[book valueForKeyPath:@"relativeBooks.@distinctUnionOfObjects.price"]);
NSLog(@"relative books count: %@",[book valueForKeyPath:@"relativeBooks.@count"]);
NSLog(@"relative books price sum: %@",[book valueForKeyPath:@"relativeBooks.@sum.price"]);
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@"relativeBooks.@avg.price"]);
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@"relativeBooks.@max.price"]);
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@relativeBooks.@min.price]);
这里增加了book3实例,它的价格和book2相同。在使用@distinctUnionOfObjects后,发现效果是消除重复的价格:
011-05-26 19:55:41.123 ReleaseMemoDemo[10378:a0f] book price is 10.4
2011-05-26 19:55:41.124 ReleaseMemoDemo[10378:a0f] relative books price: (
5,
4,
4
)
2011-05-26 19:55:41.124 ReleaseMemoDemo[10378:a0f] relative books distinct price: (
4,
5
)
KVC还可以在一个语句中为实例的多个属性赋值:
Book *book4=[[Book alloc] init];
NSArray *bookProperties=[NSArray arrayWithObjects:@"name",@"price",nil];
NSDictionary *bookPropertiesDictionary=[book4 dictionaryWithValuesForKeys:bookProperties];
NSLog(@"book values: %@",bookPropertiesDictionary);
NSDictionary *newBookPropertiesDictionary=[NSDictionary dictionaryWithObjectsAndKeys:@"《Objective C入门》",@"name",
@"20.5",@"price",nil];
[book4 setValuesForKeysWithDictionary:newBookPropertiesDictionary];
NSLog(@"book with new values: %@",[book4 dictionaryWithValuesForKeys:bookProperties]);
另外,还有两个比较高级的内容:
nil和覆盖setNilValueForKey方法
覆盖valueForUndefinedKey方法
发表评论
-
SOCK_STREAM和SOCK_DGRAM
2015-07-23 20:08 1655sock_stream 是有保障的(即能保证数据正确传送到 ... -
SOCKET bind INADDR_LOOPBACK和INADDR_ANY的区别
2015-07-23 19:49 2062今天写程序时候,服务器端启动了,然后客户端总是连接不上,con ... -
htons()
2015-07-23 19:26 589在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺 ... -
使用symbolicatecrash分析crash文件
2015-03-10 11:32 1189原文 http://www.cnblogs.com/ning ... -
程序设计中的计算复用(Computational Reuse)
2015-02-10 10:18 672从斐波那契数列说起 ... -
didReceiveMemoryWarning
2015-02-09 16:11 548IPhone下每个app可用的内存是被限制的,如果一个app使 ... -
iOS开发中怎么响应内存警告
2015-02-09 16:08 659好的应用应该在系统内存警告情况下释放一些可以重新创建的资源。在 ... -
ASIHTTPRequest多次重复请求的问题
2014-12-17 14:34 648在一个车票订购的项目中,点击一次订购,却生成了2次订单,通过抓 ... -
从 CloudKit 看 BaaS 服务的趋势
2014-09-26 11:51 731从 6 月份 WWDC 苹果发布 ... -
ios编程--AVCapture编程理解
2014-09-26 11:03 9430、媒体采集的几个东西。这里所需要明白的是,在这个流程中,这里 ... -
NSURLProtocol
2014-09-25 10:42 8261、http://nshipster.com/nsurlpro ... -
关于iOS8的extension插件
2014-09-25 10:41 1301关于iOS8的extension插件,有兴趣的同学可以参考一下 ... -
【转】ios app在itunesConnect里面的几种状态
2014-08-05 10:34 1155Waiting for Upload (Yellow) Ap ... -
[转]iOS Dev (45) iOS图标与切片处理工具Prepo
2014-02-07 17:02 1036iOS Dev (45) iOS图标与切片处理工具Prepo ... -
phoneGap开发IOS,JS调用IOS方法/phoneGap插件开发
2014-01-13 17:49 1248前沿 废话不说phoneGap是什么不多介绍,官方网站: h ... -
如何在IOS平台下搭建PhoneGap开发环境(PhoneGap2.5)
2014-01-13 15:23 754由于在下最近在做基于HTML5的跨平台移植,搭建环境的时候着实 ... -
xcode 4 制作静态库详解
2013-12-20 18:27 549最近在做Apple的IOS开发,有开发静态库的需求,本身IOS ... -
【翻译】ios教程-创建静态库
2013-12-20 18:19 3123作者:shede333 主页:htt ... -
封装自己的控件库:iPhone静态库的应用
2013-12-20 17:03 594由于iPhone 控件的极度匮乏和自定义组件在重用上的限制,在 ... -
iphone:使用NSFileManager取得目录下所有文件(遍历所有文件)
2013-11-18 17:56 877From:http://note.sdo.com/u/xiao ...
相关推荐
3. **内存管理**:使用KVC设置属性时,可能涉及自动引用计数(ARC)的问题,需要正确处理对象生命周期。 4. **非KVC-compliant属性**:并非所有属性都支持KVC,特别是那些自定义 getter 和 setter 的属性。 总的来...
1. 安全性:使用KVC时,如果键不存在,可能会导致程序崩溃,因此需要确保键的有效性。 2. 性能影响:频繁使用KVC和KVO可能对性能产生一定影响,特别是在大量数据操作或循环中。 3. 遵守约定:为了支持KVC,对象的...
**使用KVC:** 1. **属性访问**:通过`value(forKey:)`和`setValue(_:forKey:)`方法来获取和设置对象的属性。注意,属性必须遵循`DynamicProperty`协议或者使用`@dynamicMemberLookup`属性。 2. **集合操作**:KVC...
### 解锁Objective-C的KVC:深入Key-Value Coding的奥妙 Objective-C是一种功能强大且灵活的面向对象编程语言,它在C语言基础上增加了面向对象的特性。自1980年代由Brad Cox和Tom Love设计以来,Objective-C经过...
### KVC使用方法 #### 访问属性 - **`valueForKey:`**:此方法用于获取对象的属性值。例如,如果你有一个User对象,你可以用`[user valueForKey:@"name"]`来获取名字属性的值。 - **`setValue:forKey:`**:这个...
**KVC (Key-Value Coding)** 是Objective-C中的一种机制,允许间接访问对象的属性,无需使用点语法或 setter/getter 方法。它主要用于集合操作、序列化和与数据绑定框架的交互。KVC的主要优势在于可以动态地操作对象...
KVC和KVO经常一起使用,因为KVO的底层实现依赖于KVC。当调用`addObserver:forKeyPath:options:context:`时,系统会尝试使用KVC来获取和设置属性的值,从而触发KVO的通知。 ### 注意事项 1. **属性要求**:为了使...
**KVC (Key-Value Coding)** 是Objective-C中的一种机制,允许间接访问对象的属性,无需使用点语法或 setter/getter 方法。KVC是Apple框架中的一个重要组成部分,它被广泛用于数据绑定、属性检索和集合操作。通过KVC...
这个API在不扩展类或者使用KVC(Key-Value Coding)的情况下,提供了一种为对象添加额外属性的方式。这篇实战教程将深入探讨`objc_setAssociatedObject`的用法和原理。 首先,我们要明白什么是关联对象。关联对象是...
KVC允许我们通过键值来访问对象的属性,即使该属性不存在,`objc_msgSend`也会尝试寻找一个名为`key`的setter或getter方法。KVO则允许我们观察对象属性的变化,当属性改变时,`objc_msgSend`会被用来通知观察者。 *...
KVC在Apple的Cocoa和Cocoa Touch框架中广泛使用,简化了数据绑定、集合操作以及与各种数据源(如数据库和XML)的交互。 **1. KVC的基本使用** KVC提供了一种间接访问对象属性的方式,它通过`valueForKey:`和`...
总的来说,KVC和KVO在iOS开发中扮演着重要角色,它们提供了灵活性和动态性,但也需要开发者谨慎使用以确保代码的稳定性和可靠性。在实际应用中,应结合编译时类型安全和运行时动态性来平衡开发需求。
**iOS自定义KVC(Key-Value Coding)的实现与使用** KVC是Apple的Objective-C框架中的一个重要特性,它允许我们间接地访问对象的属性,而无需直接调用getter或setter方法。KVC在很多场景下都非常有用,比如数据绑定...
1. **注册和移除观察者**:使用`addObserver:forKeyPath:options:context:`方法注册观察者,`removeObserver:forKeyPath:`方法移除。注册时通常会传入`NSKeyValueObservingOptionNew`和`...
- 使用KVC时,如果尝试访问的属性不存在,KVC会尝试使用键路径来调用setter和getter方法。确保类定义中包含这些方法,或者实现`+accessInstanceVariablesDirectly`方法返回`NO`,以避免编译警告。 - 当不再需要观察...
值得注意的是,使用KVC操作对象属性时,需要确保涉及的对象已经被实例化,否则可能会导致错误。 KVC还支持批量赋值,通过`setValuesForKeysWithDictionary:`方法,可以一次性为对象的所有属性设置值。例如,从字典...
使用这些源码,开发者可以借助Xcode的调试工具,如LLDB,进行源码级别的调试,了解代码执行过程,定位和修复问题。 通过深入学习和实践这些源码,开发者不仅可以提升对Objective-C的理解,还能更好地掌握iOS开发的...
本篇文章将深入探讨KVC的底层原理,并通过具体示例来展示setter方法的使用。 KVC的核心概念是通过字符串键(key)来间接访问对象的属性。在OC中,如果一个对象遵循`NSKeyValueCoding`协议,那么它就支持KVC操作。这...
通过深入研究objc4-750.1源码,开发者可以更深刻地理解Objective-C的特性,如消息转发、KVC(Key-Value Coding)、KVO(Key-Value Observing)等,并且能够有效地调试和优化涉及运行时的代码。这对于开发高效、稳定...
3. 动态属性:为了使属性能够在KVC(Key-Value Coding)和KVO(Key-Value Observing)中正常工作,我们需要使用`objc/runtime`来实现属性的setter和getter。这涉及到`class_addMethod`和`class_getInstanceMethod`...