NSMutableArray addObject :-[__ NSArrayI addObject :] : 인식 할 수없는 선택기가 인스턴스로 전송되었습니다.
일요일부터 NSMutableArray를 100 가지 방법으로 초기화하려고했지만 아무것도 작동하지 않습니다. 새로 할당되고 초기화 된 NSMutableArray와 동일하게 설정해 보았습니다. 변수 자체를 할당하고 초기화하고 제가 생각할 수있는 모든 조합과 항상 동일한 결과를 얻었습니다.
코드는 다음과 같습니다.
Object.h
NSMutableArray *array;
@property (copy) NSMutableArray *array;
Object.m
@synthesize array;
if ( self.array ) {
[self.array addObject:anObject];
}
else {
self.array = [NSMutableArray arrayWithObjects:anObject, nil];
}
참고 : 디버그에서 "anObject"는 실행시 nil이 아닙니다 ...
anObject를 테스트했는데 초기화가 잘 작동하지만 addObject : to self.array를 시도 할 때 아래 오류가 계속 발생합니다.
2010-07-10 11 : 52 : 55.499 MyApp [4347 : 1807]-[__ NSArrayI addObject :] : 인스턴스 0x184480으로 전송 된 인식 할 수없는 선택기
2010-07-10 11 : 52 : 55.508 MyApp [4347 : 1807] *** 포착되지 않은 예외 'NSInvalidArgumentException'으로 인해 앱 종료, 이유 : '-[__ NSArrayI addObject :] : 인스턴스 0x184480으로 전송 된 인식 할 수없는 선택기'
아무도 무슨 일이 일어나고 있는지 아는 사람이 있습니까?
에 대한 합성 된 setter 는 배열에 메시지를 @property (copy)
전송하므로 copy
변경 불가능한 사본이 생성됩니다.
Objective-C 가이드에 자세히 설명 된 대로 여기에서 직접 setter를 구현할 수밖에 없습니다 .
글을 읽은 과정에서 생각이 떠 올랐고 제 질문에 답했습니다. 이 결의안은 내가 계속해서 게시물을 작성하고 직접 답변하기로 결정했을 정도로 모호했습니다 (그러므로 저와 같은 다른 초보자는 전화를 끊지 않습니다).
내 실수는 ...
@property (copy) NSMutableArray *array;
그랬어 야했는데 ...
@property (retain) NSMutableArray *array;
오류는 내가 코드를 실행하는 방식이 아니라 anObject가 NSMutableArray 배열을 "복사"하려는 방식에서 발생했습니다.
우리 모두 알다시피 ...
mutableArray = [mutableArray copy];
항상 (또는 내 경험상) 다음과 같지는 않습니다.
mutableArray = [mutableArray mutableCopy];
이것이 내 문제의 원인이었습니다. @property를 (복사)에서 (보유)로 간단히 전환하여 문제를 해결했습니다.
Georg Fritzsche에게 모자를 드리고 싶습니다. 나는 결국 (보유) 대신 (복사)를 사용해야했고 그의 입력 없이는 무엇을해야할지 몰랐을 것입니다.
//@property (copy) NSMutableArray *array;
@property (nonatomic, copy) NSMutableArray *array; //overridden method is non-atomic as it is coded and should be reflected here.
변경 가능한 객체에 사용 (복사)하려면 다음과 같이 "setter"메소드를 재정의해야합니다.
- (void)setArray:(NSArray *)newArray {
if ( array != newArray ) {
[array release];
array = [newArray mutableCopy];
// [array retain]; // unnecessary as noted by Georg Fritzsche
}
return;
}
NOTE: You will get a compiler warning: Incompatible Objective-C types initializing 'struct NSArray *', expected 'struct NSMutableArray *' I chose to declare the newArray parameter as an (NSArray *), because you are given the flexibility to have any array passed and correctly copied to your (NSMutableArray *) variable. If you wish to declare the newArray parameter as an (NSMutableArray *) you will still need to leave the mutableCopy method in place to get your desired results.
Cheers to Georg! Z@K!
I was getting the same error, even though my properties were strong (using ARC) and I allocated the array with NSMutableArray.
What was happening was that I was archiving the mutable array (as it contains custom objects) for future use and when decoding it, it returns an immutable copy.
Hope it helps anyone out there.
Have some indexes (into a data array elsewhere) and wanted to have them in numerical order (for a good reason). Crashing until added mutableCopy at the end. Totally puzzled, until I recalled that using Objective-C literal @[] returns a non-mutable array.
NSMutableArray *a = [@[@(self.indexA), @(self.indexB)] mutableCopy];
NSLog(@"%@", a);
[indexArray sortUsingComparator: ^(NSNumber *obj1, NSNumber *obj2) {
return [obj1 compare:obj2];
}];
NSLog(@"%@", a);
Thanx, Zak!
I got bitten by this exception for a typo I've made, maybe it'll save someone 5 min. of their time:
I wrote:
NSMutableArray *names = [NSArray array];
instead of:
NSMutableArray *names = [NSMutableArray array];
The compiler has no problem with that because NSMutableArray is also an NSArray, but it crashes when trying to add an object.
The error came about as a result of attempting to add an object to an NSMutableArray type that was actually pointing to an NSArray object. This type of scenario is shown in some demo code below:
NSString *test = @"test";
NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
[mutableArray addObject:test];
NSArray *immutableArray = [[NSArray alloc] init];
mutableArray = immutableArray;
[mutableArray addObject:test]; // Exception: unrecognized selector
From the above code, it is easy to see that a subclass type is being assigned to a superclass type. In Java, for instance, this would immediately have been flagged as an error (conversion error between types), and the problem resolved fairly quickly. To be fair to Objective-C, a warning is given when attempting to perform an incompatible assignment, however, this simply just does not seem to be enough sometimes and the result can be a real pain for developers. Fortunately, this time around, it was not myself who bore most of this pain :P
I had similar error saying : unrecognized selector sent to instance for NSMutable array.. After going through a lot of things, I figured out that I was using my mutable array as a property as
@property (assign, nonatomic) NSMutableArray *myMutableArray;
while copy pasting and not paying attention and it was causing the problem.
The solution us that I changed it to strong type(you can change it to any other type like strong/weak,etc.. depending your requirement). So solution in my case was :
@property (strong, nonatomic) NSMutableArray *myMutableArray;
So, be careful while copy pasting! Do check once.
This exception can happen if one of the objects in the array is null.
'program tip' 카테고리의 다른 글
임시 테이블에서 필드 이름을 검색하는 방법 (SQL Server 2008) (0) | 2020.11.10 |
---|---|
PHP에서 배열의 인덱스 값 가져 오기 (0) | 2020.11.10 |
정말 '최종'블록이 필요합니까? (0) | 2020.11.10 |
이전에 추정 된 값으로 혼합 효과 모델 추정을 다시 시작합니다. (0) | 2020.11.09 |
람다 식의 열거 형은 다르게 컴파일됩니다. (0) | 2020.11.09 |