首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法swizzling和isa swizzling是同一回事吗?

方法swizzling和isa swizzling是同一回事吗?
EN

Stack Overflow用户
提问于 2016-08-10 15:18:25
回答 1查看 3.7K关注 0票数 10

方法swizzling和isa swizzling是同一回事吗?如果没有,那么什么是isa swizzling?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-10 15:47:01

方法摆动

方法swizzling 在运行时中交换类的两种方法。这将影响修改后的类的每个实例,这些实例过去或将要创建。

示例:让我们假设您已经为NSString编写了一个类别:

代码语言:javascript
复制
@interface NSString (Swizzling)
@end
@implementation NSString (Swizzling)
- (NSString *)swizzled_uppercaseString {
    //when the method is swizzled, the original method will be called 
    //with swizzled_uppercaseString (so this will not create a stack overflow).
    NSString *result = [self swizzled_uppercaseString];
    // our custom code
    result = [result stringByAppendingString:@" (swizzled)"];
    return result;
}
@end

然后,您可以将uppercaseString-method的实现与swizzled_uppercaseString-method交换,以便在调用swizzled_uppercaseString方法时执行swizzled_uppercaseString方法的实现。(在调用uppercaseString时,将执行swizzled_uppercaseString的原始实现):

代码语言:javascript
复制
#import <objc/runtime.h>

NSString *sample = @"abc";

// original method is called:
NSLog([sample uppercaseString]); 

//Obtaining original and swizzled method:
original = class_getInstanceMethod([NSString class], @selector(uppercaseString));
swizzled = class_getInstanceMethod([NSString class], @selector(swizzled_uppercaseString));

//Exchange implementations here:
method_exchangeImplementations(original, swizzled);

// swizzled method is called:
NSLog([sample uppercaseString]); //prints "ABC (swizzled)"

伊萨斯威兹林

ISA swizzling修改单个对象上的属性,ISA (‘是’)属性,它描述对象的类,因此您可以在运行时将给定单个对象的类型与另一个类型交换。

示例:让我们假设您有这个类结构:

代码语言:javascript
复制
@interface Sample : NSObject
@property (nonatomic) NSString *sampleStringToLoad;
@end
@implementation Sample
@synthesize sampleStringToLoad;
@end

@interface SampleWithStringLoader :NSObject
@property (nonatomic) NSString *sampleStringToLoad;
-(void)loadString;
@end
@implementation SampleWithStringLoader
@synthesize sampleStringToLoad;
-(void)loadString {
self.sampleStringToLoad = @"abc";
}
@end

然后可以将类设置为SampleWithStringLoader,这样sampleStringToLoad-method就可用了:

代码语言:javascript
复制
#import <objc/runtime.h>

Sample *sample = [Sample new];
// switch isa to new class:
object_setClass(sample, [SampleWithStringLoader class]);

// invoke method that is only in SampleWithStringLoader: 
[sample performSelector:@selector(loadString)]; 

// switch isa back to original class:
object_setClass(sample,[Sample class]); 

// Prints 'abc':
NSLog(sample.sampleStringToLoad);  
票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38877465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档