makeObjectsPerformSelector:
-
05-09-2019 - |
문제
내가 원하는 모든 개체 배열에서 수행하는 선택합니다.을 발견했습 적절하게 이름 makeObjectsPerformSelector:
방법은,하지만 질문이 있습니다.내가 사용하는 경우에 그것을 배열됩니다,그것은 변경 기존이나 배열을 반환합니다.는 경우 수정하는 기존의 개체,무엇이 있는 가장 쉬운 방법을 반환하는 새로운 배열을 선택 적용됩니까?
해결책
MakeObjectSperformSelector : 배열의 모든 객체에 대해 해당 선택기를 실행할 것입니다. 해당 객체를 선택기에 의해 수정하면 수정됩니다. 아무것도 반환하지 않습니다. 이제는 기본적으로 코코아의 대부분의 사본이 얕은 사본이라는 캐치가 있습니다. 즉, 새 배열을 얻을 수 있지만 기본 객체는 동일한 객체입니다. initwithArray : Copyitems를 사용하여 루트 레벨 항목도 복사해야합니다. 변경된 개체가 포함 된 새 배열을 원한다면 이전 배열이 다음과 같은 일을합니다.
NSArray *newArray = [[NSArray alloc] initWithArray:oldArray copyItems:YES];
[newArray makeObjectsPerformSelector:@selector(doSomethingToObject)];
다른 팁
배열에서 사용하면 기존 배열을 변경하거나 새 배열을 반환합니까?
아니.
먼저 서명을 읽으십시오.
- (void)makeObjectsPerformSelector:(SEL)aSelector
void
, 그 후 별이 없으면“아무것도 반환하지 않습니다”를 의미합니다.
둘째, 이것은 불변의 계급 인 Nsarray의 방법입니다. 그러므로, makeObjectsPerformSelector:
불가능하기 때문에 수신 배열을 돌연변이하지 않습니다.
NSMutableAreRay가 있으며 NSARRAY의 서브 클래스이므로 상속합니다. makeObjectsPerformSelector:
. 그러나 NSMutableAreray가 그 방법의 동작을 변경하면 해당 문서 가이 방법에 대한 자체 목록을 갖습니다 (많은 정의 참조. init
다양한 수업의 문서에서). 그러한 목록이 없으므로 안전하게 (그리고 정확하게) -[NSMutableArray makeObjectsPerformSelector:]
정확히 같은 방식으로 작동합니다 -[NSArray makeObjectsPerformSelector:]
.
객체는 메시지에 응답하여 스스로를 수정할 수 있지만 배열 자체에는 동일한 개체가 포함됩니다. makeObjectsPerformSelector:
이전과 마찬가지로.
더하여 다른 답변,당신 마 원하는 만들 새로운 배열의 결과를 호출하는 방법은,당신은 작업을 수행 할 수 있습니다:
NSArray *derivedArray = [originalArray valueForKey:@"foo"];
이 만 작동하는 경우 객체를 처리할 수 있'-valueforkey 의:@"foo"'메시지와 물론,에만 적합한 방법을 인수 및 반환 비 nil 값입니다.
나는 이것을 올바르게 해석하기를 바랍니다 ...
MyArray makeobjectsperformselector : someselector]를 수행하면 MyArray를 통해 반복하고 각 객체에 선택자 메시지를 보냅니다. MakeObjectSperformSelector는 내용을 변경할 수 없기 때문에 배열은 변경되지 않습니다.
결국, 당신은 같은 객체가있는 동일한 배열을 가지고 있습니다.
다음 예에서는 하나를 볼 수 있습니다 superView
생성되고 10 개의 하위 뷰가 추가 된 다음 각각에게 보냅니다. removeFromSuperView
(존재하는 메소드 view
클래스) 및 결과는 제로 하위 뷰입니다 superView
.
JavaScript에 익숙하고 다음과 같은 것을 찾으려고하는 경우 map
JavaScript에서는 그렇지 않습니다. map
배열의 각 요소에 함수를 실행하고 결과로 바꾸지 만 여기에서는 makeObjectsPerformSelector
배열의 각 객체에 존재하는 메소드를 실행하십시오.
UIView* superView = [[UIView alloc] initWithFrame:CGRectZero];
for(int i = 0; i < 10; i++){
UIView* view = [[UIView alloc] initWithFrame:CGRectZero];
[superView addSubview:view];
}
NSLog(@"count = %lu", (unsigned long)[superView.subviews count]); // 10
[superView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; // removeFromSuperview is exist in `view`, you can call [view removeFromSuperview];
NSLog(@"count = %lu", (unsigned long)[superView.subviews count]); // 0