【问题标题】:Correct bridging for ARC?ARC的正确桥接?
【发布时间】:2011-10-12 22:37:00
【问题描述】:

我有一个 NSString 的类别类。

@implementation NSString (URLEncode)

- (NSString *)URLEncodedString
{
    __autoreleasing NSString *encodedString;

    NSString *originalString = (NSString *)self;    
    encodedString = (__bridge_transfer NSString * )
            CFURLCreateStringByAddingPercentEscapes(NULL,
                                (__bridge CFStringRef)originalString,
                                NULL,
                                (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                kCFStringEncodingUTF8);
    return encodedString;
}

我是否为 ARC 和新的 LLVM 使用了正确的桥接传输?

原代码:

- (NSString *)URLEncodedString
    NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                (CFStringRef)self,
                                NULL,
                                (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                kCFStringEncodingUTF8);
    return [encodedString autorelease];
}

【问题讨论】:

    标签: objective-c automatic-ref-counting


    【解决方案1】:

    正如cmets中提到的,我认为在这里谈论ARC和Automatic Reference Counting的内容很好。

    __autoreleasing 不应该这样使用。它用于传递间接对象引用(NSError** 等)。见4.3.4 Passing to an out parameter by writeback

    根据3.2.4 Bridged casts__bridge_transfer 是正确的,因为CFURLCreateStringByAddingPercentEscapes 函数返回一个保留对象(它的名称中有“create”)。您希望 ARC 获得返回对象的所有权并插入一个释放(或在本例中为自动释放)来平衡这一点。

    originalstring__bridge 演员表也是正确的,你不希望 ARC 对此做任何特别的事情。

    【讨论】:

    • 谢谢你 - 这帮助很大。我只是想确保正确应用我对文档的理解。
    • 我可能会补充一点,使用 CFBridgingRelease() 宏可以使 CFType 对象的传输和使用方式更易于阅读——至少在我看来。例如NSData *imageData = CFBridgingRelease(ABPersonCopyImageData(person))
    【解决方案2】:

    这是一个正确的,没有泄漏的版本。 正如您在 cmets 中所说:__bridge_transfer 将所有权转移到NSObject (NSString) 并假设该对象由CF Framework 保留(方法CFURLCreateStringByAddingPercentEscapes 返回一个retained 对象,所以这就是我们需要的) 而不是在 self 对象上,我们不想执行任何内存管理。希望能帮助到你 弗拉

    -(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
        return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
               (__bridge CFStringRef)self,
               NULL,
               (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
               CFStringConvertNSStringEncodingToEncoding(encoding));
    }
    

    【讨论】:

      【解决方案3】:
      -(NSString *) urlEncoded
      {
          CFStringRef encodedCfStringRef = CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)self,NULL,(CFStringRef)@"!*'\"();@+$,%#[]% ",kCFStringEncodingUTF8 );
          NSString *endcodedString = (NSString *)CFBridgingRelease(encodedCfStringRef);
          return endcodedString;
      }
      

      【讨论】:

        【解决方案4】:

        不需要__autoreleasing。正确的 ARC 语法很简单:

        - (NSString *)URLEncodedString
        {
            return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                             (CFStringRef)self,
                                                                             NULL,
                                                                             (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                             kCFStringEncodingUTF8));
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-17
          • 2011-10-25
          • 2023-03-17
          • 1970-01-01
          • 2012-04-16
          • 1970-01-01
          • 1970-01-01
          • 2012-05-29
          相关资源
          最近更新 更多