코코아 프로그래밍을 공부하다가..........

Discussion in 'OS X' started by 김혜곤, Jul 20, 2017.

  1. 김혜곤 New Member

    메모리 관리가 궁금하여 이렇게 질문을 올립니다.

    책은 Cocoa Programming 5th (Big Neard Ranch) 에서의 예제입니다.
    궁금한 점은

    클래스 멤버변수(프로퍼티)로 선언된 변수에서 계속 copy() 을 하여 생성합니다.
    그럼 이전에 생성된 메모리는 자동으로 회수가 되는것인지 궁금합니다.

    코드는 다음과 같습니다.

    class ChatWindowController: NSWindowController {

    dynamicvar log: NSAttributedString = NSAttributedString(string: "")
    dynamicvar message: String?

    // NSTextView does not support weak references.
    @IBOutletvar textView: NSTextView!


    overridevar windowNibName: String {
    return"ChatWindowController"
    }


    overridefunc windowDidLoad() {
    super.windowDidLoad()

    let notificationCenter = NotificationCenter.default
    notificationCenter.addObserver(self,
    selector: #selector(ChatWindowController.receiveDidSendMessageNotification(_:)),
    name: NSNotification.Name(rawValue: ChatWindowControllerDidSendMessageNotification),
    object: nil)
    }


    deinit {
    let notificationCenter = NotificationCenter.default
    notificationCenter.removeObserver(self)
    }


    // MARK: - Actions
    @IBActionfunc send(_ sender: NSButton) {
    sender.window?.endEditing(for: nil)
    iflet message = message {
    let userInfo = [ChatWindowControllerMessageKey : message]
    let notificationCenter = NotificationCenter.default
    notificationCenter.post(name: Notification.Name(rawValue: ChatWindowControllerDidSendMessageNotification),
    object: self,
    userInfo: userInfo)
    }
    message = ""
    }


    // MARK: - Notifications
    // ChatWindowControllerDidSendMessageNotification
    func receiveDidSendMessageNotification(_ note: Notification) {
    let mutableLog = log.mutableCopy() as! NSMutableAttributedString

    iflog.length > 0 {
    mutableLog.append(NSAttributedString(string: "\n"))
    }

    let userInfo = note.userInfo! as! [String : String]
    let message = userInfo[ChatWindowControllerMessageKey]!

    let logLine = NSAttributedString(string: message)
    mutableLog.append(logLine)

    print(CFGetRetainCount(log))

    log = mutableLog.copy() as! NSAttributedString
    print(CFGetRetainCount(log))

    textView.scrollRangeToVisible(NSRange(location: log.length, length: 0))
    }

    }


    //////////////
    위 코드에서 진한게 한 부분 즉 " log = mutableLog.copy() as! NSAttributedString"
    이 코드입니다.
    이코드가 계속 실행되면 메모리가 자동 해제되는것인지 궁금합니다.

Share This Page