热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NSURL-没有可变子类,所以不需要“复制”作为属性?-NSURL-Nomutablesubclass,sononeedto“copy”asaproperty?

@interfaceSomeClass:NSObject@property(copy,nonatomic)NSString*usefulString;@property(st
@interface SomeClass : NSObject

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

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

@end

In the above class, dangerousString is considered a bad idea because NSMutableString inherits from NSString. Meaning it is possible a user of your class could set a mutable string to dangerousString, and then later change the value of the mutable string out from underneath the instance of SomeClass. The property usefulString doesn't have this danger as it copies the value into a new (immutable) string object.

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

However, it seems like for NSURL (and any other foundation classes that don't have mutable counterparts - e.g. NSNumber) the copy semantic of the property declaration is unnecessary. NSURL does conform to NSCopying's copyWithZone: (...but I have to wonder if it doesn't just return the same object with an increased retain count - why would it do anything else?)

但是,似乎对于NSURL(以及任何其他不具有可变对应物的基础类 - 例如NSNumber),属性声明的复制语义是不必要的。 NSURL确实符合NSCopying的copyWithZone :( ...但是我不得不怀疑它是否只是返回相同的对象并增加了保留计数 - 为什么还要做其他事情?)

Why would you declare properties as copy that don't have a danger of being mutated?

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

2 个解决方案

#1


6  

The fact that Apple does not supply a mutable subclass does not mean that a malicious user could not build one specifically to trick your class. If you operate under the assumption that strings can be changed behind your class's back, you need to at least allow for a possibility of an ill-intentioned user extending NSURL into a mutable class:

Apple不提供可变子类这一事实并不意味着恶意用户无法专门构建一个欺骗您的类。如果你假设字符串可以在你的班级后面改变,你需要至少考虑到一个恶意用户将NSURL扩展到一个可变类的可能性:

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

If a programmer gives you an object of TrickThemURL and you fail to copy it before the validation, that programmer is now free to change the URL without letting your class know.

如果程序员给你一个TrickThemURL的对象而你在验证之前没有复制它,那么程序员现在可以自由地更改URL而不让你的班级知道。

#2


9  

With iOS7 you can use NSURLComponents, now it's very simple, look this examples:

使用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]]];

推荐阅读
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • nil用来给对象赋值(Objective-C中的任何对象都属于id类型),NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值(在Objective-C中类是一 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 如何使用Python从工程图图像中提取底部的方法?
    本文介绍了使用Python从工程图图像中提取底部的方法。首先将输入图片转换为灰度图像,并进行高斯模糊和阈值处理。然后通过填充潜在的轮廓以及使用轮廓逼近和矩形核进行过滤,去除非矩形轮廓。最后通过查找轮廓并使用轮廓近似、宽高比和轮廓区域进行过滤,隔离所需的底部轮廓,并使用Numpy切片提取底部模板部分。 ... [详细]
  • Myappcrashedandthecodeisthefollowing:我的应用程序崩溃,代码如下:elseif(){CGDetailVie ... [详细]
author-avatar
白日做梦家_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有