gpt4 book ai didi

objective-c - NSURL - 没有可变子类,所以不需要 "copy"作为属性?

转载 作者:太空狗 更新时间:2023-10-30 03:26:01 25 4
gpt4 key购买 nike

@interface SomeClass : NSObject

@property (copy, nonatomic) NSString *usefulString;
@property (strong, nonatomic) NSString *dangerousString;

@property (copy, nonatomic) NSURL *curiousURLOne;
@property (strong, nonatomic) NSURL *curiousURLTwo;

@end

在上面的类中,dangerousString 被认为是一个坏主意,因为 NSMutableString 继承自 NSString。这意味着您的类的用户可能会将可变字符串设置为 dangerousString,然后从 SomeClass 的实例下方更改可变字符串的值。属性 usefulString 没有这种危险,因为它将值复制到一个新的(不可变的)字符串对象中。

但是,对于 NSURL(以及任何其他没有可变对应物的基础类 - 例如 NSNumber)来说,属性声明的复制语义似乎是不必要的. NSURL 确实符合 NSCopying 的 copyWithZone: (...但我想知道它是否不只是返回保留计数增加的同一个对象 - 为什么它会做其他事情吗?)

为什么要将没有变异危险的属性声明为 copy

最佳答案

在 iOS7 中你可以使用 NSURLComponents,现在很简单,看这个例子:

NSString *urlString = @"https://mail.google.com/mail/u/0/?shva=1#inbox";
NSURLComponents *components = [[NSURLComponents alloc] initWithString:urlString];

NSLog(@"%@ - %@ - %@ - %@", components.scheme, components.host, components.query, components.fragment);



NSURLComponents *components = [NSURLComponents new];
[components setScheme:@"https"];
[components setHost:@"mail.google.com"];
[components setQuery:@"shva=1"];
[components setFragment:@"inbox"];
[components setPath:@"/mail/u/0/"];

[webview loadRequest:[[NSURLRequest alloc] initWithURL:[components URL]]];

关于objective-c - NSURL - 没有可变子类,所以不需要 "copy"作为属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13983673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com