blob: 4dae335109aa2bd73f490943fab360c59323f6b4 [file] [view]
---
name: webrtc/sdk/objc-omit-nullability-in-implementation-files
description: In Objective-C NS_ASSUME_NONNULL blocks, annotate only nullable pointers and error out-parameters with _Nullable in headers, omitting redundant nonnull and implementation annotations
rubric: readability
severity: should_fix
---
**Rule.** In Objective-C and Objective-C++ headers enclosed by
NS_ASSUME_NONNULL_BEGIN and NS_ASSUME_NONNULL_END, explicitly annotate only
pointers that accept or return nil (including method parameters, return types,
properties, and error out-parameters like NSError **_Nullable) with nullable or
_Nullable. Do not add redundant nonnull or _Nonnull annotations within
NS_ASSUME_NONNULL blocks. Additionally, omit all nullability annotations
(nullable, nonnull, _Nullable, _Nonnull) from method definitions in
implementation files (.m and .mm).
**Why.** Within NS_ASSUME_NONNULL regions, the compiler implicitly defaults all
unannotated pointer types to non-null for Swift bridging and static analysis,
making explicit nonnull or _Nonnull annotations redundant boilerplate. Pointers
accepting or returning nil (such as optional error out-pointers) must be
explicitly marked _Nullable so Swift and analyzers do not treat them as
required. Repeating nullability annotations in .m or .mm implementation files is
non-idiomatic, redundant with header declarations, and adds unnecessary
maintenance overhead.
## Examples
Bad:
```cpp
// In Header.h (enclosed by NS_ASSUME_NONNULL_BEGIN)
- (nonnull RTC_OBJC_TYPE(RTCVideoEncoderCodecSupport) *)
queryCodecSupport:(nonnull RTC_OBJC_TYPE(RTCVideoCodecInfo) *)info
scalabilityMode:(nullable NSString *)scalabilityMode;
- (BOOL)setCodecPreferences:(NSArray<RTC_OBJC_TYPE(RTCRtpCodecCapability) *> *)codecs
error:(NSError **)error;
// In Implementation.mm
- (instancetype)initWithAudioDeviceModule:
(nullable webrtc::AudioDeviceModule *)audioDeviceModule { ... }
```
Good:
```cpp
// In Header.h (enclosed by NS_ASSUME_NONNULL_BEGIN)
- (RTC_OBJC_TYPE(RTCVideoEncoderCodecSupport) *)
queryCodecSupport:(RTC_OBJC_TYPE(RTCVideoCodecInfo) *)info
scalabilityMode:(nullable NSString *)scalabilityMode;
- (BOOL)setCodecPreferences:(NSArray<RTC_OBJC_TYPE(RTCRtpCodecCapability) *> *)codecs
error:(NSError **_Nullable)error;
// In Implementation.mm
- (instancetype)initWithAudioDeviceModule:
(webrtc::AudioDeviceModule *)audioDeviceModule { ... }
```