Write, review, or improve UIKit code following best practices for view controller lifecycle, Auto Layout, collection views, navigation, animation, memory management, and modern iOS 18–26 APIs. Use when building new UIKit features, refactoring existing views or view controllers, reviewing code quality, adopting modern UIKit patterns (diffable data sources, compositional layout, cell configuration), or bridging UIKit with SwiftUI. Does not cover SwiftUI-only code.
96
100%
Does it follow best practices?
Impact
96%
1.23xAverage score across 9 eval scenarios
Passed
No known issues
{
"context": "Tests whether the agent follows memory-safety patterns for UIViewController including block-based Timer API with weak capture, delegate declared with AnyObject constraint and stored as weak, deinit logging, super calls in lifecycle methods, re-captured [weak self] in nested stored closures, and NotificationCenter observer removal in deinit.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Timer block-based API",
"description": "Timer is created using Timer.scheduledTimer(withTimeInterval:repeats:block:) — NOT the target-selector form Timer(target:selector:userInfo:repeats:) or Timer.scheduledTimer(timeInterval:target:selector:userInfo:repeats:)",
"max_score": 12
},
{
"name": "Timer weak self capture",
"description": "The Timer block captures [weak self] in its capture list",
"max_score": 10
},
{
"name": "Timer invalidated in viewWillDisappear",
"description": "timer?.invalidate() (or equivalent) is called inside an override of viewWillDisappear(_:) — NOT in deinit or viewDidDisappear",
"max_score": 12
},
{
"name": "deinit log statement",
"description": "The class contains a deinit block with at least one print() or os_log/Logger statement inside it",
"max_score": 8
},
{
"name": "super in lifecycle overrides",
"description": "Every overridden UIViewController lifecycle method (viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear, etc.) calls super",
"max_score": 8
},
{
"name": "Delegate AnyObject constraint",
"description": "StopwatchDelegate protocol declaration includes ': AnyObject' (or the equivalent class keyword) as a constraint",
"max_score": 10
},
{
"name": "Delegate stored as weak",
"description": "The delegate property is declared as 'weak var delegate: StopwatchDelegate?' — marked weak, optional, and uses the correct type",
"max_score": 10
},
{
"name": "Escaping closures use [weak self]",
"description": "All escaping closure literals (stored callbacks, completion handlers, notification blocks) capture [weak self] rather than a strong reference to self",
"max_score": 8
},
{
"name": "Nested closure re-captures [weak self]",
"description": "When a stored inner closure is created inside an escaping outer closure, the inner closure's capture list independently captures [weak self] — it does NOT rely solely on a guard-let self from the outer closure scope",
"max_score": 12
},
{
"name": "NotificationCenter observer removed in deinit",
"description": "If NotificationCenter observers are registered using the block-based API (addObserver(forName:object:queue:using:)), the returned observer token is removed (removeObserver) inside deinit",
"max_score": 10
}
]
}