Rule. In Objective-C and Objective-C++ method implementations (.m and .mm) and native observer adapter wrappers, assert that required parameters and callback blocks declared as non-null (such as those enclosed by NS_ASSUME_NONNULL_BEGIN) are non-nil at method entry using RTC_DCHECK(param) or RTC_DCHECK(param != nil). Do not omit runtime precondition checks when accepting required model/configuration objects or adapting, storing, and invoking non-nullable completion handlers.
Why. Objective-C nullability annotations are compile-time hints for Swift interoperability and static analysis, but they are not enforced at runtime and do not prevent callers from passing nil. Invoking a nil completion block or passing nil into native C++ observer adapters causes silent failures, no-op message dispatches, or runtime crashes. Asserting non-null preconditions with RTC_DCHECK at method entry catches unsupplied arguments early in debug builds before reaching native layers.
Bad:
- (void)addIceCandidate:(RTC_OBJC_TYPE(RTCIceCandidate) *)candidate completionHandler:(RTCCallbackBlock)completionHandler { // Missing RTC_DCHECK for required candidate and completionHandler. rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserverAdapter> observer(new rtc::RefCountedObject <webrtc::CreateSessionDescriptionObserverAdapter>(completionHandler)); _peerConnection->AddIceCandidate(candidate.nativeCandidate, observer.get()); }
Good:
- (void)addIceCandidate:(RTC_OBJC_TYPE(RTCIceCandidate) *)candidate completionHandler:(RTCCallbackBlock)completionHandler { RTC_DCHECK(candidate != nil); RTC_DCHECK(completionHandler != nil); rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserverAdapter> observer(new rtc::RefCountedObject <webrtc::CreateSessionDescriptionObserverAdapter>(completionHandler)); _peerConnection->AddIceCandidate(candidate.nativeCandidate, observer.get()); }