나는 object
타겟을 가지고 있고, selector
을보고, displayTitle
은 @"displayTitle: object.selector"
이라는 문자열을 출력 할 클래스를 만들고있다. 그런 다음 value
이 object.selector
일 때마다 KVO를 통해 자신을 등록하므로보기 컨트롤러에보기를 업데이트하도록 알릴 수 있습니다. 나는 이것을 추상적이고 재사용 가능한 방법으로 사용하여 객체의 다양한 속성에 대한 설명을 사용자에게 보여줍니다.objc_msgSend가 EXC_BAD_ACCESS를 발생시키는 이유는 무엇입니까?
object.selector
의 값을 얻으려고하면 LLVM gives errors when you use performSelector with a dynamic selector이므로 [object performSelector:selector]
을 사용할 수 없습니다. 그래서 정확히 this answer을 제안했습니다. 나는 objc_msgSend(object, selector)
을 사용했습니다.
- (instancetype)initWithSelector:(SEL)selector onObject:(NSObject*)object displayTitle:(NSString*)displayTitle {
self = [super init];
if (self) {
id value;
if ([object respondsToSelector:selector) {
// Used objc_msgSend instead of performSelector to suppress a LLVM warning which was caused by using a dynamic selector.
value = objc_msgSend(object, selector);
} else {
return nil;
}
[self setItemDescription:[NSString stringWithFormat:@"%@: %@", displayTitle, value]];
}
return self;
}
그리고 EXC_BAD_ACCESS
! 당신은 스크린 샷에서 볼 수 있듯이
, 나는 이 [object selector]
일을하고 있는지 확인했다.
어떻게되고 있으며 어떻게 해결할 수 있습니까?
:이 경우에 순서가 그것을 사용하는, 당신은 뭔가를해야 * 및 * 비 대상? @ VincentGeurci가 말했듯이이 속성을 NSNumber로 만들 수 있다는 것을 알고 있습니다. 그러나이 값을 응용 프로그램의 다른 위치에서 자주 사용해야 할 필요가 있으므로 다소 불편할 것입니다. –
오브젝트 및 비 오브젝트를 보유하는 objective-c의 유일한 해결책은 오브젝트 (예 : NSNumber)를 보유하는 것입니다.최근 llvm 버전에서는'NSNumber * x = @ (5)'를 사용하여 리터럴을 찾을 수 있습니다. 더 자세한 내용을 보려면 Swift가 어느 정도 이것을 해결할 때까지 기다리십시오. –
값을 introspect하여 자동으로 인코딩/디코딩 할 목적으로 C 유형을 결정할 수도 있습니다. 하지만 그게 사소한 (낮은 수준의 objc_xxx 메서드), NSNumber 방법 훨씬 쉽게. –