iOS 10 이후에도 32비트 터미널을 인식해야 하는 경우
개시하다
사용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)
이런 상황에서 Int
가 Int64(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 ↩
Reference
이 문제에 관하여(iOS 10 이후에도 32비트 터미널을 인식해야 하는 경우), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/marty-suzuki/items/a2981e1c1ec89762d6ba
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
let id: Int
let fetchRequest: NSFetchRequest
fetchRequest.predicate = NSPredicate(format: "id = %lld", id)
let id: Int
let fetchRequest: NSFetchRequest
//32bit端末対応
let key = sizeofValue(id) == sizeof(Int32) ? "%ld" : "%lld"
fetchRequest.predicate = NSPredicate(format: "id = \(key)", id)
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 ↩
Reference
이 문제에 관하여(iOS 10 이후에도 32비트 터미널을 인식해야 하는 경우), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/marty-suzuki/items/a2981e1c1ec89762d6ba텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)