diff --git a/bind/genobjc.go b/bind/genobjc.go
index 573dffc..a928989 100644
--- a/bind/genobjc.go
+++ b/bind/genobjc.go
@@ -538,7 +538,7 @@
 func (s *funcSummary) asFunc(g *ObjcGen) string {
 	var params []string
 	for _, p := range s.params {
-		params = append(params, g.objcType(p.typ)+" "+p.name)
+		params = append(params, g.objcParamType(p.typ)+" "+p.name)
 	}
 	skip := 0
 	if s.returnsVal() {
@@ -569,7 +569,7 @@
 		if i != 0 {
 			key = p.name
 		}
-		params = append(params, fmt.Sprintf("%s:(%s)%s", key, g.objcType(p.typ), p.name))
+		params = append(params, fmt.Sprintf("%s:(%s)%s", key, g.objcParamType(p.typ), p.name))
 	}
 	skip = 0
 	if s.returnsVal() {
@@ -592,7 +592,7 @@
 		if i > 0 {
 			key = p.name
 		}
-		params = append(params, fmt.Sprintf("%s:(%s)%s", key, g.objcType(p.typ), p.name))
+		params = append(params, fmt.Sprintf("%s:(%s)%s", key, g.objcParamType(p.typ), p.name))
 	}
 	return strings.Join(params, " ")
 }
@@ -1099,7 +1099,7 @@
 	g.Printf("}\n")
 	g.Printf("@property(strong, readonly) id _ref;\n")
 	g.Printf("\n")
-	g.Printf("- (instancetype)initWithRef:(id)ref;\n")
+	g.Printf("- (nonnull instancetype)initWithRef:(id)ref;\n")
 	cons := g.constructors[obj]
 	if oinf == nil {
 		for _, f := range cons {
@@ -1111,7 +1111,8 @@
 		}
 	}
 	if oinf != nil || len(cons) == 0 {
-		g.Printf("- (instancetype)init;\n")
+		// default constructor won't return nil
+		g.Printf("- (nonnull instancetype)init;\n")
 	}
 
 	// accessors to exported fields.
@@ -1120,7 +1121,7 @@
 			g.Printf("// skipped field %s.%s with unsupported type: %s\n\n", obj.Name(), f.Name(), t)
 			continue
 		}
-		name, typ := f.Name(), g.objcFieldType(f.Type())
+		name, typ := f.Name(), g.objcType(f.Type())
 		g.objcdoc(doc.Member(f.Name()))
 
 		// properties are atomic by default so explicitly say otherwise
@@ -1214,7 +1215,9 @@
 	s := g.funcSummary(obj, f)
 	doc := g.docs[f.Name()]
 	g.objcdoc(doc.Doc())
-	g.Printf("- (instancetype)%s%s;\n", s.initName, s.asInitSignature(g))
+
+	// custom inits can return nil in Go so make them nullable
+	g.Printf("- (nullable instancetype)%s%s;\n", s.initName, s.asInitSignature(g))
 }
 
 func (g *ObjcGen) genInitM(obj *types.TypeName, f *types.Func) {
@@ -1284,16 +1287,24 @@
 	return g.objcType(typ)
 }
 
-func (g *ObjcGen) objcFieldType(t types.Type) string {
-	if isErrorType(t) {
-		return "NSError*"
+func (g *ObjcGen) objcParamType(t types.Type) string {
+
+	switch typ := t.(type) {
+	case *types.Basic:
+		switch typ.Kind() {
+		case types.String, types.UntypedString:
+			return "NSString* _Nullable"
+		}
 	}
+
 	return g.objcType(t)
+
 }
 
 func (g *ObjcGen) objcType(typ types.Type) string {
+
 	if isErrorType(typ) {
-		return "NSError*"
+		return "NSError* _Nullable"
 	}
 
 	switch typ := typ.(type) {
@@ -1325,7 +1336,7 @@
 		case types.Float64, types.UntypedFloat:
 			return "double"
 		case types.String, types.UntypedString:
-			return "NSString*"
+			return "NSString* _Nonnull"
 		default:
 			g.errorf("unsupported type: %s", typ)
 			return "TODO"
@@ -1334,7 +1345,7 @@
 		elem := g.objcType(typ.Elem())
 		// Special case: NSData seems to be a better option for byte slice.
 		if elem == "byte" {
-			return "NSData*"
+			return "NSData* _Nullable"
 		}
 		// TODO(hyangah): support other slice types: NSArray or CFArrayRef.
 		// Investigate the performance implication.
@@ -1342,7 +1353,7 @@
 		return "TODO"
 	case *types.Pointer:
 		if _, ok := typ.Elem().(*types.Named); ok {
-			return g.objcType(typ.Elem()) + "*"
+			return g.objcType(typ.Elem()) + "* _Nullable"
 		}
 		g.errorf("unsupported pointer to type: %s", typ)
 		return "TODO"
@@ -1359,9 +1370,9 @@
 		switch t := typ.Underlying().(type) {
 		case *types.Interface:
 			if makeIfaceSummary(t).implementable {
-				return "id<" + g.namePrefixOf(n.Pkg()) + n.Name() + ">"
+				return "id<" + g.namePrefixOf(n.Pkg()) + n.Name() + "> _Nullable"
 			} else {
-				return g.namePrefixOf(n.Pkg()) + n.Name() + "*"
+				return g.namePrefixOf(n.Pkg()) + n.Name() + "* _Nullable"
 			}
 		case *types.Struct:
 			return g.namePrefixOf(n.Pkg()) + n.Name()
diff --git a/bind/testdata/basictypes.objc.h.golden b/bind/testdata/basictypes.objc.h.golden
index eaffdb2..134bbcf 100644
--- a/bind/testdata/basictypes.objc.h.golden
+++ b/bind/testdata/basictypes.objc.h.golden
@@ -21,11 +21,11 @@
 
 FOUNDATION_EXPORT BOOL BasictypesBool(BOOL p0);
 
-FOUNDATION_EXPORT NSData* BasictypesByteArrays(NSData* x);
+FOUNDATION_EXPORT NSData* _Nullable BasictypesByteArrays(NSData* _Nullable x);
 
-FOUNDATION_EXPORT BOOL BasictypesError(NSError** error);
+FOUNDATION_EXPORT BOOL BasictypesError(NSError* _Nullable* error);
 
-FOUNDATION_EXPORT BOOL BasictypesErrorPair(long* ret0_, NSError** error);
+FOUNDATION_EXPORT BOOL BasictypesErrorPair(long* ret0_, NSError* _Nullable* error);
 
 FOUNDATION_EXPORT void BasictypesInts(int8_t x, int16_t y, int32_t z, int64_t t, long u);
 
diff --git a/bind/testdata/basictypes.objc.m.golden b/bind/testdata/basictypes.objc.m.golden
index 665fcef..9e907ed 100644
--- a/bind/testdata/basictypes.objc.m.golden
+++ b/bind/testdata/basictypes.objc.m.golden
@@ -24,7 +24,7 @@
 	return _ret0_;
 }
 
-NSData* BasictypesByteArrays(NSData* x) {
+NSData* _Nullable BasictypesByteArrays(NSData* _Nullable x) {
 	nbyteslice _x = go_seq_from_objc_bytearray(x, 0);
 	nbyteslice r0 = proxybasictypes__ByteArrays(_x);
 	if (![x isKindOfClass:[NSMutableData class]]) {
@@ -34,7 +34,7 @@
 	return _ret0_;
 }
 
-BOOL BasictypesError(NSError** error) {
+BOOL BasictypesError(NSError* _Nullable* error) {
 	int32_t r0 = proxybasictypes__Error();
 	Universeerror* _error = nil;
 	GoSeqRef* _error_ref = go_seq_from_refnum(r0);
@@ -50,7 +50,7 @@
 	return (_error == nil);
 }
 
-BOOL BasictypesErrorPair(long* ret0_, NSError** error) {
+BOOL BasictypesErrorPair(long* ret0_, NSError* _Nullable* error) {
 	struct proxybasictypes__ErrorPair_return res = proxybasictypes__ErrorPair();
 	long _ret0_ = (long)res.r0;
 	Universeerror* _error = nil;
diff --git a/bind/testdata/doc.objc.h.golden b/bind/testdata/doc.objc.h.golden
index 11d01a7..0754847 100644
--- a/bind/testdata/doc.objc.h.golden
+++ b/bind/testdata/doc.objc.h.golden
@@ -28,8 +28,8 @@
 }
 @property(strong, readonly) id _ref;
 
-- (instancetype)initWithRef:(id)ref;
-- (instancetype)init;
+- (nonnull instancetype)initWithRef:(id)ref;
+- (nonnull instancetype)init;
 @end
 
 /**
@@ -39,27 +39,27 @@
 }
 @property(strong, readonly) id _ref;
 
-- (instancetype)initWithRef:(id)ref;
+- (nonnull instancetype)initWithRef:(id)ref;
 /**
  * NewS is a constructor.
  */
-- (instancetype)init;
+- (nullable instancetype)init;
 /**
  * SF is a field.
  */
-@property (nonatomic) NSString* sf;
+@property (nonatomic) NSString* _Nonnull sf;
 /**
  * Anonymous field.
  */
-@property (nonatomic) DocS2* s2;
+@property (nonatomic) DocS2* _Nullable s2;
 /**
  * Multiple fields.
  */
-@property (nonatomic) NSString* f1;
+@property (nonatomic) NSString* _Nonnull f1;
 /**
  * Multiple fields.
  */
-@property (nonatomic) NSString* f2;
+@property (nonatomic) NSString* _Nonnull f2;
 /**
  * After is another method.
  */
@@ -74,8 +74,8 @@
 }
 @property(strong, readonly) id _ref;
 
-- (instancetype)initWithRef:(id)ref;
-- (instancetype)init;
+- (nonnull instancetype)initWithRef:(id)ref;
+- (nonnull instancetype)init;
 @end
 
 /**
@@ -93,14 +93,14 @@
 /**
  * A specific var.
  */
-+ (NSString*) specific;
-+ (void) setSpecific:(NSString*)v;
++ (NSString* _Nonnull) specific;
++ (void) setSpecific:(NSString* _Nonnull)v;
 
 /**
  * V is a var.
  */
-+ (NSString*) v;
-+ (void) setV:(NSString*)v;
++ (NSString* _Nonnull) v;
++ (void) setV:(NSString* _Nonnull)v;
 
 @end
 
@@ -112,7 +112,7 @@
 /**
  * NewS is a constructor.
  */
-FOUNDATION_EXPORT DocS* DocNewS(void);
+FOUNDATION_EXPORT DocS* _Nullable DocNewS(void);
 
 @class DocI;
 
diff --git a/bind/testdata/doc.objc.m.golden b/bind/testdata/doc.objc.m.golden
index 9d6dd5d..ebb201a 100644
--- a/bind/testdata/doc.objc.m.golden
+++ b/bind/testdata/doc.objc.m.golden
@@ -47,20 +47,20 @@
 	return self;
 }
 
-- (NSString*)sf {
+- (NSString* _Nonnull)sf {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	nstring r0 = proxydoc_S_SF_Get(refnum);
 	NSString *_r0 = go_seq_to_objc_string(r0);
 	return _r0;
 }
 
-- (void)setSF:(NSString*)v {
+- (void)setSF:(NSString* _Nonnull)v {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	nstring _v = go_seq_from_objc_string(v);
 	proxydoc_S_SF_Set(refnum, _v);
 }
 
-- (DocS2*)s2 {
+- (DocS2* _Nullable)s2 {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	int32_t r0 = proxydoc_S_S2_Get(refnum);
 	DocS2* _r0 = nil;
@@ -74,7 +74,7 @@
 	return _r0;
 }
 
-- (void)setS2:(DocS2*)v {
+- (void)setS2:(DocS2* _Nullable)v {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	int32_t _v;
 	if ([v conformsToProtocol:@protocol(goSeqRefInterface)]) {
@@ -86,27 +86,27 @@
 	proxydoc_S_S2_Set(refnum, _v);
 }
 
-- (NSString*)f1 {
+- (NSString* _Nonnull)f1 {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	nstring r0 = proxydoc_S_F1_Get(refnum);
 	NSString *_r0 = go_seq_to_objc_string(r0);
 	return _r0;
 }
 
-- (void)setF1:(NSString*)v {
+- (void)setF1:(NSString* _Nonnull)v {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	nstring _v = go_seq_from_objc_string(v);
 	proxydoc_S_F1_Set(refnum, _v);
 }
 
-- (NSString*)f2 {
+- (NSString* _Nonnull)f2 {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	nstring r0 = proxydoc_S_F2_Get(refnum);
 	NSString *_r0 = go_seq_to_objc_string(r0);
 	return _r0;
 }
 
-- (void)setF2:(NSString*)v {
+- (void)setF2:(NSString* _Nonnull)v {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	nstring _v = go_seq_from_objc_string(v);
 	proxydoc_S_F2_Set(refnum, _v);
@@ -177,23 +177,23 @@
 	return _r0;
 }
 
-+ (void) setSpecific:(NSString*)v {
++ (void) setSpecific:(NSString* _Nonnull)v {
 	nstring _v = go_seq_from_objc_string(v);
 	var_setdoc_Specific(_v);
 }
 
-+ (NSString*) specific {
++ (NSString* _Nonnull) specific {
 	nstring r0 = var_getdoc_Specific();
 	NSString *_r0 = go_seq_to_objc_string(r0);
 	return _r0;
 }
 
-+ (void) setV:(NSString*)v {
++ (void) setV:(NSString* _Nonnull)v {
 	nstring _v = go_seq_from_objc_string(v);
 	var_setdoc_V(_v);
 }
 
-+ (NSString*) v {
++ (NSString* _Nonnull) v {
 	nstring r0 = var_getdoc_V();
 	NSString *_r0 = go_seq_to_objc_string(r0);
 	return _r0;
@@ -206,7 +206,7 @@
 	proxydoc__F();
 }
 
-DocS* DocNewS(void) {
+DocS* _Nullable DocNewS(void) {
 	int32_t r0 = proxydoc__NewS();
 	DocS* _ret0_ = nil;
 	GoSeqRef* _ret0__ref = go_seq_from_refnum(r0);
diff --git a/bind/testdata/ignore.objc.h.golden b/bind/testdata/ignore.objc.h.golden
index 98df76c..b4b23d7 100644
--- a/bind/testdata/ignore.objc.h.golden
+++ b/bind/testdata/ignore.objc.h.golden
@@ -26,8 +26,8 @@
 }
 @property(strong, readonly) id _ref;
 
-- (instancetype)initWithRef:(id)ref;
-- (instancetype)init;
+- (nonnull instancetype)initWithRef:(id)ref;
+- (nonnull instancetype)init;
 // skipped field S.F with unsupported type: interface{}
 
 // skipped method S.Argument with unsupported parameter or return types
diff --git a/bind/testdata/interfaces.objc.h.golden b/bind/testdata/interfaces.objc.h.golden
index f78b482..a25f498 100644
--- a/bind/testdata/interfaces.objc.h.golden
+++ b/bind/testdata/interfaces.objc.h.golden
@@ -29,7 +29,7 @@
 @class InterfacesWithParam;
 
 @protocol InterfacesError <NSObject>
-- (BOOL)err:(NSError**)error;
+- (BOOL)err:(NSError* _Nullable*)error;
 @end
 
 @protocol InterfacesI <NSObject>
@@ -59,7 +59,7 @@
 @end
 
 @protocol InterfacesI3 <NSObject>
-- (InterfacesI1*)f;
+- (InterfacesI1* _Nullable)f;
 @end
 
 @protocol InterfacesInterfaces <NSObject>
@@ -79,11 +79,11 @@
 - (void)hasParam:(BOOL)p0;
 @end
 
-FOUNDATION_EXPORT int32_t InterfacesAdd3(id<InterfacesI> r);
+FOUNDATION_EXPORT int32_t InterfacesAdd3(id<InterfacesI> _Nullable r);
 
-FOUNDATION_EXPORT BOOL InterfacesCallErr(id<InterfacesError> e, NSError** error);
+FOUNDATION_EXPORT BOOL InterfacesCallErr(id<InterfacesError> _Nullable e, NSError* _Nullable* error);
 
-FOUNDATION_EXPORT id<InterfacesI> InterfacesSeven(void);
+FOUNDATION_EXPORT id<InterfacesI> _Nullable InterfacesSeven(void);
 
 @class InterfacesError;
 
@@ -104,7 +104,7 @@
 @property(strong, readonly) id _ref;
 
 - (instancetype)initWithRef:(id)ref;
-- (BOOL)err:(NSError**)error;
+- (BOOL)err:(NSError* _Nullable*)error;
 @end
 
 @interface InterfacesI : NSObject <goSeqRefInterface, InterfacesI> {
@@ -124,7 +124,7 @@
 @property(strong, readonly) id _ref;
 
 - (instancetype)initWithRef:(id)ref;
-- (InterfacesI1*)f;
+- (InterfacesI1* _Nullable)f;
 @end
 
 /**
diff --git a/bind/testdata/interfaces.objc.m.golden b/bind/testdata/interfaces.objc.m.golden
index 54383df..da83529 100644
--- a/bind/testdata/interfaces.objc.m.golden
+++ b/bind/testdata/interfaces.objc.m.golden
@@ -17,7 +17,7 @@
 	return self;
 }
 
-- (BOOL)err:(NSError**)error {
+- (BOOL)err:(NSError* _Nullable*)error {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	int32_t r0 = proxyinterfaces_Error_Err(refnum);
 	Universeerror* _error = nil;
@@ -99,7 +99,7 @@
 	return self;
 }
 
-- (InterfacesI1*)f {
+- (InterfacesI1* _Nullable)f {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	int32_t r0 = proxyinterfaces_I3_F(refnum);
 	InterfacesI1* _ret0_ = nil;
@@ -195,7 +195,7 @@
 
 
 
-int32_t InterfacesAdd3(id<InterfacesI> r) {
+int32_t InterfacesAdd3(id<InterfacesI> _Nullable r) {
 	int32_t _r;
 	if ([r conformsToProtocol:@protocol(goSeqRefInterface)]) {
 		id<goSeqRefInterface> r_proxy = (id<goSeqRefInterface>)(r);
@@ -208,7 +208,7 @@
 	return _ret0_;
 }
 
-BOOL InterfacesCallErr(id<InterfacesError> e, NSError** error) {
+BOOL InterfacesCallErr(id<InterfacesError> _Nullable e, NSError* _Nullable* error) {
 	int32_t _e;
 	if ([e conformsToProtocol:@protocol(goSeqRefInterface)]) {
 		id<goSeqRefInterface> e_proxy = (id<goSeqRefInterface>)(e);
@@ -231,7 +231,7 @@
 	return (_error == nil);
 }
 
-id<InterfacesI> InterfacesSeven(void) {
+id<InterfacesI> _Nullable InterfacesSeven(void) {
 	int32_t r0 = proxyinterfaces__Seven();
 	InterfacesI* _ret0_ = nil;
 	GoSeqRef* _ret0__ref = go_seq_from_refnum(r0);
@@ -291,7 +291,7 @@
 int32_t cproxyinterfaces_I3_F(int32_t refnum) {
 	@autoreleasepool {
 		InterfacesI3* o = go_seq_objc_from_refnum(refnum);
-		InterfacesI1* ret0_;
+		InterfacesI1* _Nullable ret0_;
 		ret0_ = [o f];
 		int32_t _ret0_;
 		if ([ret0_ conformsToProtocol:@protocol(goSeqRefInterface)]) {
diff --git a/bind/testdata/issue10788.objc.h.golden b/bind/testdata/issue10788.objc.h.golden
index 751e5d9..fed5085 100644
--- a/bind/testdata/issue10788.objc.h.golden
+++ b/bind/testdata/issue10788.objc.h.golden
@@ -16,17 +16,17 @@
 @class Issue10788TestInterface;
 
 @protocol Issue10788TestInterface <NSObject>
-- (void)doSomeWork:(Issue10788TestStruct*)s;
-- (void)multipleUnnamedParams:(long)p0 p1:(NSString*)p1 日本:(int64_t)日本;
+- (void)doSomeWork:(Issue10788TestStruct* _Nullable)s;
+- (void)multipleUnnamedParams:(long)p0 p1:(NSString* _Nullable)p1 日本:(int64_t)日本;
 @end
 
 @interface Issue10788TestStruct : NSObject <goSeqRefInterface> {
 }
 @property(strong, readonly) id _ref;
 
-- (instancetype)initWithRef:(id)ref;
-- (instancetype)init;
-@property (nonatomic) NSString* value;
+- (nonnull instancetype)initWithRef:(id)ref;
+- (nonnull instancetype)init;
+@property (nonatomic) NSString* _Nonnull value;
 @end
 
 @class Issue10788TestInterface;
@@ -36,8 +36,8 @@
 @property(strong, readonly) id _ref;
 
 - (instancetype)initWithRef:(id)ref;
-- (void)doSomeWork:(Issue10788TestStruct*)s;
-- (void)multipleUnnamedParams:(long)p0 p1:(NSString*)p1 日本:(int64_t)日本;
+- (void)doSomeWork:(Issue10788TestStruct* _Nullable)s;
+- (void)multipleUnnamedParams:(long)p0 p1:(NSString* _Nullable)p1 日本:(int64_t)日本;
 @end
 
 #endif
diff --git a/bind/testdata/issue10788.objc.m.golden b/bind/testdata/issue10788.objc.m.golden
index e8f6ba3..c218e33 100644
--- a/bind/testdata/issue10788.objc.m.golden
+++ b/bind/testdata/issue10788.objc.m.golden
@@ -26,14 +26,14 @@
 	return self;
 }
 
-- (NSString*)value {
+- (NSString* _Nonnull)value {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	nstring r0 = proxyissue10788_TestStruct_Value_Get(refnum);
 	NSString *_r0 = go_seq_to_objc_string(r0);
 	return _r0;
 }
 
-- (void)setValue:(NSString*)v {
+- (void)setValue:(NSString* _Nonnull)v {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	nstring _v = go_seq_from_objc_string(v);
 	proxyissue10788_TestStruct_Value_Set(refnum, _v);
@@ -51,7 +51,7 @@
 	return self;
 }
 
-- (void)doSomeWork:(Issue10788TestStruct*)s {
+- (void)doSomeWork:(Issue10788TestStruct* _Nullable)s {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	int32_t _s;
 	if ([s conformsToProtocol:@protocol(goSeqRefInterface)]) {
@@ -63,7 +63,7 @@
 	proxyissue10788_TestInterface_DoSomeWork(refnum, _s);
 }
 
-- (void)multipleUnnamedParams:(long)p0 p1:(NSString*)p1 日本:(int64_t)日本 {
+- (void)multipleUnnamedParams:(long)p0 p1:(NSString* _Nullable)p1 日本:(int64_t)日本 {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	nint _p0 = (nint)p0;
 	nstring _p1 = go_seq_from_objc_string(p1);
diff --git a/bind/testdata/issue12328.objc.h.golden b/bind/testdata/issue12328.objc.h.golden
index cf77c41..3fb9333 100644
--- a/bind/testdata/issue12328.objc.h.golden
+++ b/bind/testdata/issue12328.objc.h.golden
@@ -17,9 +17,9 @@
 }
 @property(strong, readonly) id _ref;
 
-- (instancetype)initWithRef:(id)ref;
-- (instancetype)init;
-@property (nonatomic) NSError* err;
+- (nonnull instancetype)initWithRef:(id)ref;
+- (nonnull instancetype)init;
+@property (nonatomic) NSError* _Nullable err;
 @end
 
 #endif
diff --git a/bind/testdata/issue12328.objc.m.golden b/bind/testdata/issue12328.objc.m.golden
index e46f6ac..6f2c9b7 100644
--- a/bind/testdata/issue12328.objc.m.golden
+++ b/bind/testdata/issue12328.objc.m.golden
@@ -26,7 +26,7 @@
 	return self;
 }
 
-- (NSError*)err {
+- (NSError* _Nullable)err {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	int32_t r0 = proxyissue12328_T_Err_Get(refnum);
 	Universeerror* _r0 = nil;
@@ -40,7 +40,7 @@
 	return _r0;
 }
 
-- (void)setErr:(NSError*)v {
+- (void)setErr:(NSError* _Nullable)v {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	int32_t _v;
 	if ([v conformsToProtocol:@protocol(goSeqRefInterface)]) {
diff --git a/bind/testdata/issue12403.objc.h.golden b/bind/testdata/issue12403.objc.h.golden
index b617237..bfc6d04 100644
--- a/bind/testdata/issue12403.objc.h.golden
+++ b/bind/testdata/issue12403.objc.h.golden
@@ -15,8 +15,8 @@
 @class Issue12403Parsable;
 
 @protocol Issue12403Parsable <NSObject>
-- (NSString*)fromJSON:(NSString*)jstr;
-- (NSString*)toJSON:(NSError**)error;
+- (NSString* _Nonnull)fromJSON:(NSString* _Nullable)jstr;
+- (NSString* _Nonnull)toJSON:(NSError* _Nullable*)error;
 @end
 
 @class Issue12403Parsable;
@@ -26,8 +26,8 @@
 @property(strong, readonly) id _ref;
 
 - (instancetype)initWithRef:(id)ref;
-- (NSString*)fromJSON:(NSString*)jstr;
-- (NSString*)toJSON:(NSError**)error;
+- (NSString* _Nonnull)fromJSON:(NSString* _Nullable)jstr;
+- (NSString* _Nonnull)toJSON:(NSError* _Nullable*)error;
 @end
 
 #endif
diff --git a/bind/testdata/issue12403.objc.m.golden b/bind/testdata/issue12403.objc.m.golden
index 4b732f1..8d62c88 100644
--- a/bind/testdata/issue12403.objc.m.golden
+++ b/bind/testdata/issue12403.objc.m.golden
@@ -17,7 +17,7 @@
 	return self;
 }
 
-- (NSString*)fromJSON:(NSString*)jstr {
+- (NSString* _Nonnull)fromJSON:(NSString* _Nullable)jstr {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	nstring _jstr = go_seq_from_objc_string(jstr);
 	nstring r0 = proxyissue12403_Parsable_FromJSON(refnum, _jstr);
@@ -25,7 +25,7 @@
 	return _ret0_;
 }
 
-- (NSString*)toJSON:(NSError**)error {
+- (NSString* _Nonnull)toJSON:(NSError* _Nullable*)error {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	struct proxyissue12403_Parsable_ToJSON_return res = proxyissue12403_Parsable_ToJSON(refnum);
 	NSString *_ret0_ = go_seq_to_objc_string(res.r0);
@@ -54,7 +54,7 @@
 	@autoreleasepool {
 		Issue12403Parsable* o = go_seq_objc_from_refnum(refnum);
 		NSString *_jstr = go_seq_to_objc_string(jstr);
-		NSString* ret0_;
+		NSString* _Nonnull ret0_;
 		ret0_ = [o fromJSON:_jstr];
 		nstring _ret0_ = go_seq_from_objc_string(ret0_);
 		return _ret0_;
@@ -64,7 +64,7 @@
 struct cproxyissue12403_Parsable_ToJSON_return cproxyissue12403_Parsable_ToJSON(int32_t refnum) {
 	@autoreleasepool {
 		Issue12403Parsable* o = go_seq_objc_from_refnum(refnum);
-		NSString* ret0_;
+		NSString* _Nonnull ret0_;
 		NSError* error = nil;
 		ret0_ = [o toJSON:&error];
 		nstring _ret0_ = go_seq_from_objc_string(ret0_);
diff --git a/bind/testdata/issue29559.objc.h.golden b/bind/testdata/issue29559.objc.h.golden
index 0ce3cf8..6638e14 100644
--- a/bind/testdata/issue29559.objc.h.golden
+++ b/bind/testdata/issue29559.objc.h.golden
@@ -11,6 +11,6 @@
 #include "Universe.objc.h"
 
 
-FOUNDATION_EXPORT void Issue29559TakesAString(NSString* s);
+FOUNDATION_EXPORT void Issue29559TakesAString(NSString* _Nullable s);
 
 #endif
diff --git a/bind/testdata/issue29559.objc.m.golden b/bind/testdata/issue29559.objc.m.golden
index c01628c..83a9b8d 100644
--- a/bind/testdata/issue29559.objc.m.golden
+++ b/bind/testdata/issue29559.objc.m.golden
@@ -9,7 +9,7 @@
 #include "Issue29559.objc.h"
 
 
-void Issue29559TakesAString(NSString* s) {
+void Issue29559TakesAString(NSString* _Nullable s) {
 	nstring _s = go_seq_from_objc_string(s);
 	proxyissue29559__TakesAString(_s);
 }
diff --git a/bind/testdata/keywords.objc.h.golden b/bind/testdata/keywords.objc.h.golden
index 8ebd53d..4fa7864 100644
--- a/bind/testdata/keywords.objc.h.golden
+++ b/bind/testdata/keywords.objc.h.golden
@@ -72,9 +72,9 @@
 - (void)while;
 @end
 
-FOUNDATION_EXPORT void KeywordsConst(NSString* id_);
+FOUNDATION_EXPORT void KeywordsConst(NSString* _Nullable id_);
 
-FOUNDATION_EXPORT void KeywordsStatic(NSString* strictfp);
+FOUNDATION_EXPORT void KeywordsStatic(NSString* _Nullable strictfp);
 
 @class KeywordsKeywordCaller;
 
diff --git a/bind/testdata/keywords.objc.m.golden b/bind/testdata/keywords.objc.m.golden
index 1ccbdb3..21dbdb1 100644
--- a/bind/testdata/keywords.objc.m.golden
+++ b/bind/testdata/keywords.objc.m.golden
@@ -296,12 +296,12 @@
 
 
 
-void KeywordsConst(NSString* id_) {
+void KeywordsConst(NSString* _Nullable id_) {
 	nstring _id_ = go_seq_from_objc_string(id_);
 	proxykeywords__Const(_id_);
 }
 
-void KeywordsStatic(NSString* strictfp) {
+void KeywordsStatic(NSString* _Nullable strictfp) {
 	nstring _strictfp = go_seq_from_objc_string(strictfp);
 	proxykeywords__Static(_strictfp);
 }
diff --git a/bind/testdata/structs.objc.h.golden b/bind/testdata/structs.objc.h.golden
index f53802c..244cfd3 100644
--- a/bind/testdata/structs.objc.h.golden
+++ b/bind/testdata/structs.objc.h.golden
@@ -25,11 +25,11 @@
 }
 @property(strong, readonly) id _ref;
 
-- (instancetype)initWithRef:(id)ref;
-- (instancetype)init;
+- (nonnull instancetype)initWithRef:(id)ref;
+- (nonnull instancetype)init;
 @property (nonatomic) double x;
 @property (nonatomic) double y;
-- (StructsS*)identity:(NSError**)error;
+- (StructsS* _Nullable)identity:(NSError* _Nullable*)error;
 - (double)sum;
 @end
 
@@ -37,10 +37,10 @@
 }
 @property(strong, readonly) id _ref;
 
-- (instancetype)initWithRef:(id)ref;
-- (instancetype)init;
+- (nonnull instancetype)initWithRef:(id)ref;
+- (nonnull instancetype)init;
 - (void)m;
-- (NSString*)string;
+- (NSString* _Nonnull)string;
 @end
 
 /**
@@ -50,14 +50,14 @@
 }
 @property(strong, readonly) id _ref;
 
-- (instancetype)initWithRef:(id)ref;
-- (instancetype)init;
+- (nonnull instancetype)initWithRef:(id)ref;
+- (nonnull instancetype)init;
 - (void)m;
 @end
 
-FOUNDATION_EXPORT StructsS* StructsIdentity(StructsS* s);
+FOUNDATION_EXPORT StructsS* _Nullable StructsIdentity(StructsS* _Nullable s);
 
-FOUNDATION_EXPORT StructsS* StructsIdentityWithError(StructsS* s, NSError** error);
+FOUNDATION_EXPORT StructsS* _Nullable StructsIdentityWithError(StructsS* _Nullable s, NSError* _Nullable* error);
 
 @class StructsI;
 
diff --git a/bind/testdata/structs.objc.m.golden b/bind/testdata/structs.objc.m.golden
index 87b1da8..dec7196 100644
--- a/bind/testdata/structs.objc.m.golden
+++ b/bind/testdata/structs.objc.m.golden
@@ -52,7 +52,7 @@
 	proxystructs_S_Y_Set(refnum, _v);
 }
 
-- (StructsS*)identity:(NSError**)error {
+- (StructsS* _Nullable)identity:(NSError* _Nullable*)error {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	struct proxystructs_S_Identity_return res = proxystructs_S_Identity(refnum);
 	StructsS* _ret0_ = nil;
@@ -113,7 +113,7 @@
 	proxystructs_S2_M(refnum);
 }
 
-- (NSString*)string {
+- (NSString* _Nonnull)string {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	nstring r0 = proxystructs_S2_String(refnum);
 	NSString *_ret0_ = go_seq_to_objc_string(r0);
@@ -167,7 +167,7 @@
 
 
 
-StructsS* StructsIdentity(StructsS* s) {
+StructsS* _Nullable StructsIdentity(StructsS* _Nullable s) {
 	int32_t _s;
 	if ([s conformsToProtocol:@protocol(goSeqRefInterface)]) {
 		id<goSeqRefInterface> s_proxy = (id<goSeqRefInterface>)(s);
@@ -187,7 +187,7 @@
 	return _ret0_;
 }
 
-StructsS* StructsIdentityWithError(StructsS* s, NSError** error) {
+StructsS* _Nullable StructsIdentityWithError(StructsS* _Nullable s, NSError* _Nullable* error) {
 	int32_t _s;
 	if ([s conformsToProtocol:@protocol(goSeqRefInterface)]) {
 		id<goSeqRefInterface> s_proxy = (id<goSeqRefInterface>)(s);
diff --git a/bind/testdata/try.objc.h.golden b/bind/testdata/try.objc.h.golden
index 7045c6b..f72f7cc 100644
--- a/bind/testdata/try.objc.h.golden
+++ b/bind/testdata/try.objc.h.golden
@@ -11,6 +11,6 @@
 #include "Universe.objc.h"
 
 
-FOUNDATION_EXPORT NSString* TryThis(void);
+FOUNDATION_EXPORT NSString* _Nonnull TryThis(void);
 
 #endif
diff --git a/bind/testdata/try.objc.m.golden b/bind/testdata/try.objc.m.golden
index 8c6d281..a8d6392 100644
--- a/bind/testdata/try.objc.m.golden
+++ b/bind/testdata/try.objc.m.golden
@@ -9,7 +9,7 @@
 #include "Try.objc.h"
 
 
-NSString* TryThis(void) {
+NSString* _Nonnull TryThis(void) {
 	nstring r0 = proxytry__This();
 	NSString *_ret0_ = go_seq_to_objc_string(r0);
 	return _ret0_;
diff --git a/bind/testdata/underscores.objc.h.golden b/bind/testdata/underscores.objc.h.golden
index 302b30f..56e922b 100644
--- a/bind/testdata/underscores.objc.h.golden
+++ b/bind/testdata/underscores.objc.h.golden
@@ -17,9 +17,9 @@
 }
 @property(strong, readonly) id _ref;
 
-- (instancetype)initWithRef:(id)ref;
-- (instancetype)init;
-@property (nonatomic) NSString* underscore_field;
+- (nonnull instancetype)initWithRef:(id)ref;
+- (nonnull instancetype)init;
+@property (nonatomic) NSString* _Nonnull underscore_field;
 @end
 
 @interface Underscore_pkg : NSObject
diff --git a/bind/testdata/underscores.objc.m.golden b/bind/testdata/underscores.objc.m.golden
index 4cac5a5..116b28b 100644
--- a/bind/testdata/underscores.objc.m.golden
+++ b/bind/testdata/underscores.objc.m.golden
@@ -26,14 +26,14 @@
 	return self;
 }
 
-- (NSString*)underscore_field {
+- (NSString* _Nonnull)underscore_field {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	nstring r0 = proxyunderscore_pkg_Underscore_struct_Underscore_field_Get(refnum);
 	NSString *_r0 = go_seq_to_objc_string(r0);
 	return _r0;
 }
 
-- (void)setUnderscore_field:(NSString*)v {
+- (void)setUnderscore_field:(NSString* _Nonnull)v {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	nstring _v = go_seq_from_objc_string(v);
 	proxyunderscore_pkg_Underscore_struct_Underscore_field_Set(refnum, _v);
diff --git a/bind/testdata/universe.objc.h.golden b/bind/testdata/universe.objc.h.golden
index ce2b08c..d0ee3dc 100644
--- a/bind/testdata/universe.objc.h.golden
+++ b/bind/testdata/universe.objc.h.golden
@@ -13,7 +13,7 @@
 @class Universeerror;
 
 @protocol Universeerror <NSObject>
-- (NSString*)error;
+- (NSString* _Nonnull)error;
 @end
 
 @class Universeerror;
@@ -23,7 +23,7 @@
 @property(strong, readonly) id _ref;
 
 - (instancetype)initWithRef:(id)ref;
-- (NSString*)error;
+- (NSString* _Nonnull)error;
 @end
 
 #endif
diff --git a/bind/testdata/universe.objc.m.golden b/bind/testdata/universe.objc.m.golden
index 4e42757..0bfa3a2 100644
--- a/bind/testdata/universe.objc.m.golden
+++ b/bind/testdata/universe.objc.m.golden
@@ -19,7 +19,7 @@
 	return self;
 }
 
-- (NSString*)error {
+- (NSString* _Nonnull)error {
 	int32_t refnum = go_seq_go_to_refnum(self._ref);
 	nstring r0 = proxy_error_Error(refnum);
 	NSString *_ret0_ = go_seq_to_objc_string(r0);
@@ -33,7 +33,7 @@
 nstring cproxy_error_Error(int32_t refnum) {
 	@autoreleasepool {
 		Universeerror* o = go_seq_objc_from_refnum(refnum);
-		NSString* ret0_;
+		NSString* _Nonnull ret0_;
 		ret0_ = [o localizedDescription];
 		nstring _ret0_ = go_seq_from_objc_string(ret0_);
 		return _ret0_;
diff --git a/bind/testdata/vars.objc.h.golden b/bind/testdata/vars.objc.h.golden
index d5964a8..d1586de 100644
--- a/bind/testdata/vars.objc.h.golden
+++ b/bind/testdata/vars.objc.h.golden
@@ -22,8 +22,8 @@
 }
 @property(strong, readonly) id _ref;
 
-- (instancetype)initWithRef:(id)ref;
-- (instancetype)init;
+- (nonnull instancetype)initWithRef:(id)ref;
+- (nonnull instancetype)init;
 @end
 
 @interface Vars : NSObject
@@ -39,11 +39,11 @@
 + (double) aFloat64;
 + (void) setAFloat64:(double)v;
 
-+ (NSString*) aString;
-+ (void) setAString:(NSString*)v;
++ (NSString* _Nonnull) aString;
++ (void) setAString:(NSString* _Nonnull)v;
 
-+ (VarsS*) aStructPtr;
-+ (void) setAStructPtr:(VarsS*)v;
++ (VarsS* _Nullable) aStructPtr;
++ (void) setAStructPtr:(VarsS* _Nullable)v;
 
 + (long) anInt;
 + (void) setAnInt:(long)v;
@@ -60,8 +60,8 @@
 + (int8_t) anInt8;
 + (void) setAnInt8:(int8_t)v;
 
-+ (id<VarsI>) anInterface;
-+ (void) setAnInterface:(id<VarsI>)v;
++ (id<VarsI> _Nullable) anInterface;
++ (void) setAnInterface:(id<VarsI> _Nullable)v;
 
 @end
 
diff --git a/bind/testdata/vars.objc.m.golden b/bind/testdata/vars.objc.m.golden
index 6e5cb3c..9bc4f98 100644
--- a/bind/testdata/vars.objc.m.golden
+++ b/bind/testdata/vars.objc.m.golden
@@ -86,18 +86,18 @@
 	return _r0;
 }
 
-+ (void) setAString:(NSString*)v {
++ (void) setAString:(NSString* _Nonnull)v {
 	nstring _v = go_seq_from_objc_string(v);
 	var_setvars_AString(_v);
 }
 
-+ (NSString*) aString {
++ (NSString* _Nonnull) aString {
 	nstring r0 = var_getvars_AString();
 	NSString *_r0 = go_seq_to_objc_string(r0);
 	return _r0;
 }
 
-+ (void) setAStructPtr:(VarsS*)v {
++ (void) setAStructPtr:(VarsS* _Nullable)v {
 	int32_t _v;
 	if ([v conformsToProtocol:@protocol(goSeqRefInterface)]) {
 		id<goSeqRefInterface> v_proxy = (id<goSeqRefInterface>)(v);
@@ -108,7 +108,7 @@
 	var_setvars_AStructPtr(_v);
 }
 
-+ (VarsS*) aStructPtr {
++ (VarsS* _Nullable) aStructPtr {
 	int32_t r0 = var_getvars_AStructPtr();
 	VarsS* _r0 = nil;
 	GoSeqRef* _r0_ref = go_seq_from_refnum(r0);
@@ -176,7 +176,7 @@
 	return _r0;
 }
 
-+ (void) setAnInterface:(id<VarsI>)v {
++ (void) setAnInterface:(id<VarsI> _Nullable)v {
 	int32_t _v;
 	if ([v conformsToProtocol:@protocol(goSeqRefInterface)]) {
 		id<goSeqRefInterface> v_proxy = (id<goSeqRefInterface>)(v);
@@ -187,7 +187,7 @@
 	var_setvars_AnInterface(_v);
 }
 
-+ (id<VarsI>) anInterface {
++ (id<VarsI> _Nullable) anInterface {
 	int32_t r0 = var_getvars_AnInterface();
 	VarsI* _r0 = nil;
 	GoSeqRef* _r0_ref = go_seq_from_refnum(r0);
