메시지 전달을 통해 NSNull 객체 작업으로 인한 충돌 해결
-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
NSMethodSignature *signature = [super methodSignatureForSelector:aSelector];
if (!signature) {
signature = [self.displayLabel methodSignatureForSelector:aSelector];
}
return signature;
}
-(void)forwardInvocation:(NSInvocation *)anInvocation
{
SEL selector = [anInvocation selector];
if ([self.displayLabel respondsToSelector:selector]) {
[anInvocation invokeWithTarget:self.displayLabel];
}
}
다음 예에서 UIViewController는 UIlable 속성 디스플레이 레이블을 포함하고 있습니다. 만약 UIViewController가 [instance setText:@ "string"방법을 실제 호출한다면 클래스가 setText를 실현하지 못했기 때문입니다. 방법은 위의 두 줄 코드를 통해 전송되고 디스플레이 레이블이 실현됩니다.
#import "RootVC.h"
@interface RootVC ()
@end
@implementation RootVC
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"Root";
[self addButton];
// Do any additional setup after loading the view.
}
-(void)addButton
{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(20.0, 100.0, 100.0, 40.0);
[btn setTitle:@"Next" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(naviNext) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(20.0, 140.0, 200.0, 30.0)];
self.displayLabel = label;
[self.view addSubview:label];
[label release];
[self setText:@" "]; // setText , , self.displayLabel
}
-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
NSMethodSignature *signature = [super methodSignatureForSelector:aSelector];
if (!signature) {
signature = [self.displayLabel methodSignatureForSelector:aSelector];
}
return signature;
}
-(void)forwardInvocation:(NSInvocation *)anInvocation
{
SEL selector = [anInvocation selector];
if ([self.displayLabel respondsToSelector:selector]) {
[anInvocation invokeWithTarget:self.displayLabel];
}
}
-(void)naviNext
{
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
다음은 포장된 분류입니다
//
// TestController.m
// 0803test
//
// Created by Xudongdong on 2017/8/29.
// Copyright © 2017 Xudongdong. All rights reserved.
//
#import
@interface NSNull (InternalNullExtention)
@end
//
// TestController.m
// 0803test
//
// Created by Xudongdong on 2017/8/29.
// Copyright © 2017 Xudongdong. All rights reserved.
//
// http://blog.rpplusplus.me/blog/2014/03/28/nsnull-category/
#define NSNullObjects @[@"",@0,@{},@[]]
#import "NSNull+InternalNullExtention.h"
@implementation NSNull (InternalNullExtention)
- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
{
NSMethodSignature* signature = [super methodSignatureForSelector:selector];
if (!signature) {
for (NSObject *object in NSNullObjects) {
signature = [object methodSignatureForSelector:selector];
if (signature) {
break;
}
}
}
return signature;
}
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
SEL aSelector = [anInvocation selector];
for (NSObject *object in NSNullObjects) {
if ([object respondsToSelector:aSelector]) {
[anInvocation invokeWithTarget:object];
return;
}
}
[self doesNotRecognizeSelector:aSelector];
}
@end
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.