Explorar o código

Merge pull request #3884 from dmaclach/unsafe

Simplify getter/setter method implementations
Thomas Van Lenten %!s(int64=7) %!d(string=hai) anos
pai
achega
6552c5af3f
Modificáronse 1 ficheiros con 9 adicións e 4 borrados
  1. 9 4
      objectivec/GPBMessage.m

+ 9 - 4
objectivec/GPBMessage.m

@@ -2998,7 +2998,10 @@ typedef struct ResolveIvarAccessorMethodResult {
   SEL encodingSelector;
   SEL encodingSelector;
 } ResolveIvarAccessorMethodResult;
 } 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) {
                            ResolveIvarAccessorMethodResult *result) {
   GPBDataType fieldDataType = GPBGetFieldDataType(field);
   GPBDataType fieldDataType = GPBGetFieldDataType(field);
   switch (fieldDataType) {
   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,
                            GPBFileSyntax syntax,
                            ResolveIvarAccessorMethodResult *result) {
                            ResolveIvarAccessorMethodResult *result) {
   GPBDataType fieldDataType = GPBGetFieldDataType(field);
   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
   // 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
   // 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.
   // no need for checks here to see if has*/setHas* are allowed.
-
   ResolveIvarAccessorMethodResult result = {NULL, NULL};
   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);
     BOOL isMapOrArray = GPBFieldIsMapOrArray(field);
     if (!isMapOrArray) {
     if (!isMapOrArray) {
       // Single fields.
       // Single fields.