iOS 10 이후에도 32비트 터미널을 인식해야 하는 경우

4853 단어 Swiftios10iOS

개시하다


사용Int을 통해 설비는 64비트나 32비트를 의식하지 못한 상태에서 코드를 쓸 수 있게 되었는데, 푹 빠진 곳이 있기 때문에 총괄하고 싶습니다.
※ 현재 확인된 것은 NSPredicate에서만 발생한 붕괴입니다.

iOS 10 지원 장치


1
이 가운데 iPhone5, iPhone5c, iPad 4th, iPad mini 2는 32비트 단말기다.
최신 OS는 32비트 터미널을 지원하기 때문에 비트 수 주변에 붕괴가 발생할 경우 고려해야 한다.

터미널의bit수를 의식해야 하는 상황은?

let id: Int
let fetchRequest: NSFetchRequest
fetchRequest.predicate = NSPredicate(format: "id = %lld", id)
이런 상황에서 IntInt64(long long int)인 것을 감안하면 %lld로 지정해야 한다고 생각합니다.
그러나 %lld 32비트 터미널에서 실행할 때 오류가 발생할 수 있습니다.
String(format:_:) 중 무너지지 않는 가격만 있고, NSPredicate(format:_:) 무너질 수 있습니다.
이걸 간단하게 해결하는 방법은 %lld%ld로 바꾸는 거예요.sizeofValue(id)sizeof(Int32)를 비교하여 %ld 또는 %lld로 나누는 방법도 있다.
let id: Int
let fetchRequest: NSFetchRequest
//32bit端末対応
let key = sizeofValue(id) == sizeof(Int32) ? "%ld" : "%lld"
fetchRequest.predicate = NSPredicate(format: "id = \(key)", id)

그나저나 Objective-C에서...


32비트 단말기 실행%lld은 값을 이상하게 만들 뿐 붕괴가 발생하지 않습니다.
NSInteger id = 10; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id = %lld", id];
NSLog(@"%@", predicate);

최후

Int32의 최대치는 21474833647로 최대치를 초과하면 32비트 터미널이 정상적으로 작동하지 않지만 32비트와 64비트 터미널을 머릿속 어딘가에 두면 불필요한 붕괴를 방지할 수 있다.

2016/10/05


다음 코드도 대응할 수 있다.
let id: Int
let fetchRequest: NSFetchRequest
fetchRequest.predicate = NSPredicate(format: "id = %@", NSNumber(value: id))
분기점을 쓸 필요가 없기 때문에 NSNumber를 쓰면 매끄러울 수 있다.
https://support.apple.com/ja-jp/km206870  

좋은 웹페이지 즐겨찾기