//
// main.m
// Refect
//
// Created by Rayln Guan on 9/13/13.
// Copyright (c) 2013 Rayln Guan. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Student.h"
#import "Person.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Student *stu = [[Student alloc] init];
//判断Student是否是Person的类或者子类
BOOL is = [stu isKindOfClass:[Person class]];
NSLog(@"%i", is);
//判断Student是否是Person类(不包括子类)
[stu isMemberOfClass:[Person class]];
//判断某个类是否实现了某个协议
//[stu conformsToProtocol:<#(Protocol *)#>]
//判断某个类是否拥有参数提供的方法
[stu respondsToSelector:@selector(select)];
//间接调用方法
[stu performSelector:@selector(test1)];
[stu performSelector:@selector(test2:) withObject:@"abc"];
//延迟调用
[stu performSelector:@selector(test2:) withObject:@"abc" afterDelay:2];
#pragma mark - reflect
//类名反射
NSString *str = @"Person";
Class class = NSClassFromString(str);
Person *person = [[class alloc] init];
//Class变成字符串
NSString *name = NSStringFromClass([Person class]);
//方法反射
NSString *method = @"test1";
SEL selector = NSSelectorFromString(method);
[person performSelector:selector];
//将sel转化为字符串
NSString *method1 = NSStringFromSelector(selector);
[person release];
}
return 0;
}
Person和 Student只是定义了test1和test2方法而已
分享到:
相关推荐
通过`-[NSObject valueForKey:]`和`-[NSObject setValue:forKey:]`方法,我们可以读写私有属性,但需要注意的是,这可能会绕过正常的setter逻辑,所以应谨慎使用。 4. **方法的交换(Method Swizzling)**:Runtime...
Json 对象创建器使用反射从 Json 字符串创建目标 C 对象用法@interface UserObject : NSObject@property (strong, nonatomic) NSString* text;@property (strong, nonatomic) NSString* username;@property (strong,...
在提供的两个文件——`NSObject+Ext.h`和`NSObject+Ext.m`中,我们可以看到`NSObject`的分类(Category)扩展。在Objective-C中,分类可以给现有的类添加新的方法,而不影响原有的代码结构。在这个库中,`NSObject+...
- **性能优化**:KVC通常用于数据绑定、序列化和反射等场景,但在性能敏感的代码中应谨慎使用,因为它涉及到额外的运行时查找。 3. **Key-Value Observing (KVO)** - **定义**:KVO是一种观察对象属性变化的技术...
在Objective-C中,反射主要通过Foundation框架的NSClassFromString、-[NSObject performSelector:]等方法实现,使得我们可以在运行时动态地获取类信息、调用方法、访问属性等。 二、Objective-C的元类(Meta-class...
Foundation框架中的`NSObject`类提供了反射的功能,可以通过反射来动态调用方法或获取对象的信息。 #### 拷贝 在处理数据时,经常需要复制对象。Foundation框架提供了两种拷贝方式:浅拷贝和深拷贝。浅拷贝仅复制...
**KVC(Key-Value Coding)是iOS开发中的一个重要概念,它是Apple...总的来说,KVC在很多场景下都提供了极大的灵活性,特别是在绑定、数据模型和反射等方面。理解并熟练掌握KVC的使用,对于iOS开发者来说是非常重要的。
例如,我们可以获取属性的名字(通过`NSSelectorFromString`)和类型,然后使用`setValue:forKey:`或`setValue:forKeyPath:`方法设置值。 ```objc - (NSArray *)fetchUsersFromDatabase { NSMutableArray *users =...
这通常涉及KVC(Key-Value Coding)和反射机制。KVC允许我们通过键值来访问对象的属性,而反射则让我们可以在运行时检查类的信息,如属性列表,进而实现动态的JSON解析。 优化可能包括以下方面: 1. 性能提升:通过...
通常,这涉及到反射(Reflection)和动态类型(Dynamic Typing)的使用,以便在运行时访问和调用私有对象。Swift中,我们可以使用`Objective-C`的桥接来实现这一点,因为Objective-C允许更多的底层操作。 1. **使用...
这种动态性使得Objective-C非常适合进行反射和元编程。 3. **协议(Protocols)**:Objective-C的协议类似于Java和C#的接口,定义了一组可选的方法声明。对象可以遵循一个或多个协议,以实现特定的功能或交互。在...
Runtime支持KVC的实现,如`-[NSObject valueForKey:]`和`-[NSObject setValue:forKey:]`。 8. **协议(Protocol)** 通过Runtime,我们可以检查对象是否遵循某个协议,`conformsToProtocol:`函数就是为此设计的。...
- 性能:相比于直接访问属性,KVC操作通常较慢,因为它涉及反射和消息发送。 在实际开发中,KVO和KVC通常结合使用,例如在MVVM架构中,模型(Model)的属性变化通过KVO传递给视图模型(ViewModel),然后ViewModel...
正确理解和使用`@objc`可以帮助开发者更好地设计跨平台的iOS和macOS应用。在项目中,应当谨慎使用`@objc`,避免无谓的性能损失,同时确保代码的兼容性和可维护性。 TestObjc这个压缩包可能包含了相关的示例代码或者...
使用KVC的基本语法是通过`valueForKey:`和`setValue:forKey:`方法来获取和设置属性值。例如,对于一个名为`person`的对象,如果它有一个`name`属性,可以这样操作: ```objc NSString *name = [person valueForKey:...
例如,如果有一个`Person`类包含`name`和`age`属性,可以使用KVC来访问这些属性。 **示例代码**: ```objc @interface Person : NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, ...
在iOS和Mac开发中,Objective-C的Runtime是一个强大的工具,它允许我们在运行时...但在实际应用中,我们需要根据项目需求和具体场景来决定是否使用此类工具,因为过度依赖Runtime可能会增加代码的复杂性和不可预测性。
`来获取类,再结合Swift的泛型和反射特性进行操作。 `ReflectionDemo-master`这个压缩包可能包含了一个示例项目,演示了如何在Objective-C或Swift中实现这个功能。通过查看该项目的源代码,你可以更深入地了解这一...
- **Objective-C**: 仅支持**动态派发**(消息派发),这使得Objective-C在处理动态类型和反射时非常强大。 #### 6. 函数式编程 - **Swift**: 支持**函数式编程特性**,包括高阶函数等,这使得Swift在处理数据流和...
- iPhone应用程序和macOS 10.5及之后版本中的64位程序均使用Objective-C运行时系统的现行版本。 - 对于macOS中的32位程序,则使用早期版本。 #### 与运行时系统的交互 Objective-C程序可以通过以下几种方式与...