|  | @@ -2998,7 +2998,10 @@ typedef struct ResolveIvarAccessorMethodResult {
 | 
	
		
			
				|  |  |    SEL encodingSelector;
 | 
	
		
			
				|  |  |  } ResolveIvarAccessorMethodResult;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static void ResolveIvarGet(GPBFieldDescriptor *field,
 | 
	
		
			
				|  |  | +// |field| can be __unsafe_unretained because they are created at startup
 | 
	
		
			
				|  |  | +// and are essentially global. No need to pay for retain/release when
 | 
	
		
			
				|  |  | +// they are captured in blocks.
 | 
	
		
			
				|  |  | +static void ResolveIvarGet(__unsafe_unretained GPBFieldDescriptor *field,
 | 
	
		
			
				|  |  |                             ResolveIvarAccessorMethodResult *result) {
 | 
	
		
			
				|  |  |    GPBDataType fieldDataType = GPBGetFieldDataType(field);
 | 
	
		
			
				|  |  |    switch (fieldDataType) {
 | 
	
	
		
			
				|  | @@ -3040,7 +3043,8 @@ static void ResolveIvarGet(GPBFieldDescriptor *field,
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static void ResolveIvarSet(GPBFieldDescriptor *field,
 | 
	
		
			
				|  |  | +// See comment about __unsafe_unretained on ResolveIvarGet.
 | 
	
		
			
				|  |  | +static void ResolveIvarSet(__unsafe_unretained GPBFieldDescriptor *field,
 | 
	
		
			
				|  |  |                             GPBFileSyntax syntax,
 | 
	
		
			
				|  |  |                             ResolveIvarAccessorMethodResult *result) {
 | 
	
		
			
				|  |  |    GPBDataType fieldDataType = GPBGetFieldDataType(field);
 | 
	
	
		
			
				|  | @@ -3084,9 +3088,10 @@ static void ResolveIvarSet(GPBFieldDescriptor *field,
 | 
	
		
			
				|  |  |    // NOTE: hasOrCountSel_/setHasSel_ will be NULL if the field for the given
 | 
	
		
			
				|  |  |    // message should not have has support (done in GPBDescriptor.m), so there is
 | 
	
		
			
				|  |  |    // no need for checks here to see if has*/setHas* are allowed.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |    ResolveIvarAccessorMethodResult result = {NULL, NULL};
 | 
	
		
			
				|  |  | -  for (GPBFieldDescriptor *field in descriptor->fields_) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // See comment about __unsafe_unretained on ResolveIvarGet.
 | 
	
		
			
				|  |  | +  for (__unsafe_unretained GPBFieldDescriptor *field in descriptor->fields_) {
 | 
	
		
			
				|  |  |      BOOL isMapOrArray = GPBFieldIsMapOrArray(field);
 | 
	
		
			
				|  |  |      if (!isMapOrArray) {
 | 
	
		
			
				|  |  |        // Single fields.
 |