     
     /// Returns layout constraints with options.
     public func constraints(_ options: NSLayoutFormatOptions) -> [NSLayoutConstraint] {
+        /// fail it if views are changed in case of the weak pointers' targets being deallocated
+        guard views.count == viewCount else { return [] }
         return NSLayoutConstraint.constraints(withVisualFormat: format, options: options, metrics: vflDictionary(metrics), views: vflDictionary(views))
     }
     

public struct VisualFormatLanguage : ExpressibleByStringInterpolation {
    
    let format: String
    var metrics = NSHashTable<NSNumber>(options: NSPointerFunctions.Options.weakMemory)
    var views = NSHashTable<UIView>(options: NSPointerFunctions.Options.weakMemory)
    
    public init(stringInterpolation strings: VisualFormatLanguage...) {
        var format = ""

            }
            for view in vfl.views.allObjects {
                views.add(view)
                viewCount += 1
            }
        }
        self.format = format
    }
    
    public init<T>(stringInterpolationSegment expr: T) {
        if let view = expr as? UIView {
            format = vflKey(view)
            views.add(view)
            viewCount += 1
        } else if let number = expr as? NSNumber {
            format = vflKey(number)
            metrics.add(number)
        } else {
            format = String(describing: expr)
        }
    }
    
    func vflDictionary<T>(_ table: NSHashTable<T>) -> [String : AnyObject] {
