10
@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いるため、悪い考えと見なされます。つまり、クラスのユーザーが変更可能な文字列を に設定し、後で変更可能な文字列の値を のインスタンスの下から変更する可能性があります。このプロパティは、値を新しい (不変の) 文字列オブジェクトにコピーするため、この危険はありません。NSMutableStringNSStringdangerousStringSomeClassusefulString

ただし、 for NSURL(および可変の対応するものを持たない他の基本クラス - などNSNumber) のように見えますが、プロパティ宣言のコピー セマンティックは不要です。NSURLNSCopyingに準拠していcopyWithZone: ます(...しかし、保持カウントが増加した同じオブジェクトを返すだけではないのではないかと考えなければなりません-なぜ他のことをするのでしょうか?)

copy変異の危険性がないのに、なぜプロパティを宣言するのでしょうか?

4

2 に答える 2

9

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]]];
于 2014-02-26T18:12:40.213 に答える
6

Appleが可変サブクラスを提供していないという事実は、悪意のあるユーザーがクラスをだますために特別にサブクラスを構築できなかったことを意味するものではありません。文字列がクラスの背後で変更される可能性があるという前提で操作する場合は、少なくとも、意図しないユーザーNSURLが可変クラスに拡張される可能性を考慮する必要があります。

@interface TrickThemURL : NSURL
    // override key properties, such as baseURL and host, to be mutable
@end

プログラマーがオブジェクトを提供TrickThemURLし、検証前にそれをコピーしなかった場合、そのプログラマーはクラスに通知せずにURLを自由に変更できるようになりました。

于 2012-12-21T03:02:28.967 に答える