[Swift Tips 독서노트] Objective-C에서 Swift까지(3)

2905 단어
  • UnsafePointer
  • C 포인터 메모리 관리
  • CopaquePointer 및 C convention
  • GCD 및 지연 시간 조정
  • 객체 유형 획득
  • 자성
  • --

    UnsafePointer - 포인터 전용 변환


    swift 사상에서 모든 인용이나 변수의 유형은 그들의 실제 유형에 정확하고 정확하게 대응한다.임의의 유형 전환을 할 수 없거나 지침을 통해 엉뚱한 짓을 할 수 없다.UnsafePointer와 그것의 일련의 변체는 C 언어 지침에 대한 접근과 전환 방법이다.C 언어에서 메모리 주소를 매개 변수로 받아들이면 Swift에서 메모리 주소를 UnsafePointer 유형으로 변경합니다.
    C 언어
    Swift 언어
    const Type *
    UnsafePointer
    Type *
    UnsafeMutablePointer
    C에서 주소의 값을 취하는 데 사용*하고 Swift는 memory 값을 취할 수 있다.
    방법 전참이 바늘 주소일 때 Swift와 C는 모두 변수 이름 앞에 &를 붙인다
    사용unsafeBitCast 강제 변환
      // unsafeBitCast                         ,         。    `unsafe`   。
     let str = unsafeBitCast(CFArrayGetValueAtIndex(arr, 0), to: CFString.self)
    

    --

    C 포인터 메모리 관리


    swift에서 C 포인터를 자동으로 메모리 관리할 수 없습니다.수동으로 메모리 관리를 해야 하며, 관리 원칙은 누가 신청하고 누가 석방하는가이다.
    포인터 사용allocateinitialize를 만들고 마지막으로 deinitializedeallocate를 사용하여 포인터가 가리키는 메모리의 대상과 포인터 자체를 방출합니다.
    지침의 메모리 신청도 malloc 또는 calloc로 사용할 수 있으며, 이때 방출free--

    CopaquePointer 및 C convention


    C에는 헤더 파일에서 정의를 찾을 수 없고 세부 사항도 숨겨져 있다.불투명 포인터(Opaque Pointer)라고 합니다.
    swift에서 이 불투명 바늘에 대응하는 유형은 COpaquePointerC에서 유형을 정할 수 있는 지침은 swfit에서 사용UnsafePointer하여 대응한다.
    C의 함수 바늘은 swift에서 클립으로 변환할 수 있지만 @convention 표시를 붙여야 합니다
    --

    GCD 및 지연 시간 조정


    GCD의 asyncAfter를 사용하여 시간 지연 기능을 실현할 수 있다.
      let interval : TimeInterval = 2.0
      DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + interval) {
            print("  UI")
      }
    

    --

    객체 유형 가져오기

    //    type(of:)
    let new = "hhhhhhh"
    let type0 = type(of: new)
    let p = People()
    let type1 = type(of: p)
    print("type0 is \(type0), type1 is \(type1)" )
    

    --

    스스로 반성하다


    대상에게 자성이라는 유형이 있는지 확인하기 위해 질문을 보냅니다.
    //OC: 
    [obj1 isKindOfClass:[ClassA class]];
    [obj2 isMemberOfClass:[ClassB class]];
    
    //Swift ,NSObject               .
    let u = User.sharedUser
    let b0 =  u.isKind(of: User.self)  //true
    let b1 = u.isMember(of: People.self) //false
    
    //     NSObject   
    class People { }
    let p1 : AnyObject = People()
    let b2 = p1.isKind(of: People.self)  //true
    let b3 = p1.isKind(of: User.self)    //false
    
    //     NSObject  ,     `is`     
    let p2 : AnyObject = People()
    if (p2 is User) {
            print("p2   User")
     } else if (p2 is People) {
            print("p2   People")  //     
    }
    
    //              ,  `is`      。
    let p3 = People()
    if (p3 is People) {  //⚠️  : "is" test always true
           print("p3   people")
    }
    

    좋은 웹페이지 즐겨찾기