문제

내가 원하는 모든 개체 배열에서 수행하는 선택합니다.을 발견했습 적절하게 이름 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top