5
나는 [NSKeyedArchiver archivedDataWithRootObject:self.data]
에 충돌이 방법이 있습니다충돌은
@synchronized(self.data)
로 보호되는
- (void) synchronize
{
@synchronized (self.data)
{
NSData *encryptedData = [[NSKeyedArchiver archivedDataWithRootObject:self.data] NL_AES256EncryptWithKey:userKey]; //La ça crash
BOOL success = [NSKeyedArchiver archiveRootObject:encryptedData toFile:[self filename]];
if (!success)
{
// we lost some data :(
NSLog(@"Failed to synchronize to file %@", [self filename]);
}
}
}
및 이 속성은 비공개입니다.
아이디어가 있으십니까?
편집 : 충돌 로그는 명시 적입니다 :
*** Collection <__NSArrayM: 0x1756a800> was mutated while being enumerated.
0 CoreFoundation 0x2e95becb __exceptionPreprocess + 131
1 libobjc.A.dylib 0x390f2ce7 objc_exception_throw + 39
2 CoreFoundation 0x2e95b9b9 -[NSException name] + 1
3 Foundation 0x2f2dd647 -[NSKeyedArchiver _encodeArrayOfObjects:forKey:] + 383
4 Foundation 0x2f2ddc2d -[NSArray(NSArray) encodeWithCoder:] + 189
5 Foundation 0x2f2dc479 _encodeObject + 1061
6 Foundation 0x2f2dd657 -[NSKeyedArchiver _encodeArrayOfObjects:forKey:] + 399
7 Foundation 0x2f2dd329 -[NSDictionary(NSDictionary) encodeWithCoder:] + 921
8 Foundation 0x2f2dc479 _encodeObject + 1061
9 Foundation 0x2f2e2899 +[NSKeyedArchiver archivedDataWithRootObject:] + 157
하지만 충돌을 방지하기 위해 진행하는 방법을 모르겠어요.
self.data를 변경하려면 다른 스레드를 사용하고 있습니까? – jailani
코드의 어느 위치에서나 열거 형 API를 사용하고 있습니까? self.data가 Mutable 데이터 유형이고 Enumeration API와 함께 사용하는 경우이 종류의 충돌이 발생합니다. 한 번에 두 가지를 동시에 사용할 수는 없습니다. – DShah
@ jailani : 예 :이 클래스는 프로젝트에서 데이터를 저장하는 데 사용되는 도구 클래스입니다. 그러나이 클래스의 모든 메서드는 모든 코드에서 다른 스레드에서 호출됩니다. – NiClou