【IOS】 readonly IOS下实战入门

本文探讨了在Objective-C编程中遇到的一个常见问题:如何在类的内部修改被标记为readonly的属性。通过两种方法——使用指针和重新声明属性——来解决这一问题,并讨论了它们各自的适用场景。

当非常多XXX.h 文件属性YY设计中,对外的设计是 YY(readonly) 时。外界便不能改动该属性,

同一时候问题也来了,该XXX类的内部也不能改动改YY属性了。你瞬间凌乱过么。

。。Y_Y

然后就发现例如以下两种方法:

一:指针

永远不要小看指针的力量,在内部能够用 obj->_YY 的方式改动YY属性了,这样的方式也确实

有点让人YY

    // 瞬间变红有木有
//    self.YYname = @"skyming";
    
    self->_YYname = @"skyming";
    或 _YYname = @"skyming";
 

二:又一次声明属性

貌似非常正规的样子,假设自己写的类属性有不多,公司也没有什么其它代码规范。直接放在

.m 中又一次声明一遍就好了

对照下吧 .h 中的声明

@interface XXX : NSObject

@property (nonatomic, readonly, strong) NSString *YYname;
@end

.m 中的声明
@interface XXX ()

@property (nonatomic, readwrite, strong) NSString *YYname;
@end
假设你同一个属性。.h 文件、 .m 文件里都是readonly ,就会报错


当然假设属性多了,或者在SDK中的话直接就再写个Private的.h 吧

并且非常多公司内部的SDK中也是这么搞的、、、

假设你们公司的SDK是这样,就默默点赞吧, Y_Y


转载于:https://www.cnblogs.com/wzzkaifa/p/6772432.html

<think>我们正在处理一个关于在iOS系统中使用nohup命令修改只读文件时遇到“Permission Denied”错误的问题。由于iOS系统基于Unix(BSD),因此我们可以从文件权限和系统保护机制的角度来分析。 首先,我们需要明确几个关键点: 1. iOS系统对文件系统有严格的权限控制,特别是系统文件和部分用户文件。 2. 使用`nohup`命令只是让进程忽略SIGHUP信号,从而在退出终端时继续运行,它本身并不改变文件操作的权限。 3. “Permission Denied”错误通常意味着当前用户对目标文件或目录没有足够的权限(写权限)。 因此,解决这个问题的核心是获取足够的权限来修改目标文件或目录。在iOS中,这通常涉及到以下方法: 方法1:使用超级用户权限(root) 在越狱的iOS设备上,我们可以使用`su`或`sudo`命令来以root用户身份执行命令。例如: ```bash nohup sudo vi filename & ``` 或者先切换到root用户,再执行命令。 方法2:修改文件权限 如果文件的所有者或组允许,我们可以尝试修改文件的权限,使其可写。例如: ```bash chmod u+w filename # 给文件的所有者添加写权限 ``` 然后再使用nohup运行修改文件的命令。 方法3:更改文件的所有权 如果当前用户不是文件的所有者,我们可以尝试将文件的所有权更改为当前用户(需要root权限): ```bash sudo chown $USER filename ``` 然后再尝试修改。 方法4:检查文件系统保护 iOS有一个保护机制叫做“Sticky Bit”,用于保护某些目录(如/tmp),但更常见的是系统完整性保护(System Integrity Protection, SIP)。在非越狱设备上,用户无法修改系统文件和部分受保护的文件。 对于非越狱设备,用户通常只能修改自己沙盒内的文件(即应用程序自己的文档目录)。因此,如果目标文件位于系统目录,则几乎不可能修改。 方法5:使用其他工具 对于越狱设备,可以使用如Filza等文件管理器来修改文件权限和所有权。 步骤总结: 1. 确认目标文件的路径和当前权限:使用`ls -l filename`查看权限。 2. 如果文件在用户可写目录(如用户主目录),尝试修改权限或所有权(需要时使用sudo)。 3. 如果文件在系统目录,且设备已越狱,则使用root权限操作。 4. 如果设备未越狱,则无法修改系统文件,只能修改用户自己的文件(如应用沙盒内的文件)。 注意:在iOS中,默认情况下,用户是`mobile`,而root用户是禁用的(除非越狱后启用)。因此,在越狱环境中,我们才能使用root权限。 示例: 假设我们要修改一个位于`/var/mobile/Documents`目录下的文件`test.txt`,该文件当前权限为只读(-r--r--r--),我们可以这样做: ```bash # 查看当前权限 ls -l /var/mobile/Documents/test.txt # 输出:-r--r--r-- 1 mobile mobile 0 May 20 12:00 test.txt # 添加写权限(需要当前用户是文件所有者或root) chmod u+w /var/mobile/Documents/test.txt # 或者使用root权限修改 sudo chmod u+w /var/mobile/Documents/test.txt # 然后就可以修改文件了 nohup echo "new content" > /var/mobile/Documents/test.txt & ``` 如果文件在系统目录,比如`/etc/hosts`,则需要root权限直接操作: ```bash nohup sudo vi /etc/hosts & ``` 但是,请注意,在非越狱设备上,这些操作都是不允许的。 因此,结论是: - 如果设备已越狱,可以使用root权限(sudo)来修改只读文件。 - 如果设备未越狱,则只能修改用户自己的沙盒内的文件,无法修改系统文件或受保护的文件。 相关问题: 1. 如何在iOS设备上获取root权限? 2. 如何查看iOS中的文件权限? 3. 在非越狱的iOS设备上,如何修改应用沙盒内的文件? 4. 使用nohup命令时,如何管理输出和日志?</think>在iOS系统中遇到`nohup`修改只读文件时提示**Permission Denied**,这通常涉及权限问题而非`nohup`本身。以下是系统级原因和解决方案: ### 核心原因 1. **文件系统限制** iOS采用APFS文件系统,系统分区默认为**只读**挂载(即使越狱后部分目录仍受保护)[^1]。 例如系统文件权限通常为: ```bash $ ls -l /System/Library/ -r--r--r-- 1 root wheel 16384 Jan 1 2020 CoreServices ``` 2. **沙盒机制** 非越狱环境下,所有App运行在沙盒中,只能访问`/var/mobile/Containers/`下的私有目录[^2]。 3. **权限继承** `nohup`仅保持进程后台运行,不提升权限。若当前用户(如`mobile`)无写权限,操作必然失败: ```bash $ id uid=501(mobile) gid=501(mobile) ``` ### 解决方案 #### ✅ 方案1:修改文件所有权(需越狱) ```bash # 1. 获取root权限 $ sudo su # 2. 更改文件所有者 $ chown mobile /path/to/file # 3. 添加写权限 $ chmod u+w /path/to/file # 4. 用nohup执行修改 $ nohup your_command > /dev/null 2>&1 & ``` #### ✅ 方案2:重定向到可写目录 ```bash # 1. 复制文件到用户目录 $ cp /readonly/file.txt /var/mobile/Documents/ # 2. 修改副本文件 $ nohup sed -i 's/old/new/g' /var/mobile/Documents/file.txt & # 3. 替换原文件(需root) $ sudo mv /var/mobile/Documents/file.txt /original/location ``` #### ⚠️ 非越狱设备替代方案 通过**FilzaEscaped**等漏洞访问沙盒外文件(不稳定): 1. 使用Filza文件管理器找到目标文件 2. 点击`ℹ️` → 权限 → 添加`Write`权限 3. 通过SSH执行`nohup`命令 ### 关键验证步骤 ```bash # 检查文件权限 $ ls -l /path/to/file -r--r--r-- 1 root wheel 0 Jan 1 00:00 file # 只读状态 # 测试写能力 $ echo test > /path/to/file -bash: /path/to/file: Permission denied # 预期失败 ``` > **重要提示**:修改系统文件可能导致iOS崩溃或丢失保修,操作前务必备份。 --- ### 相关问题 1. 如何在非越狱iOS设备上访问系统文件? 2. iOS沙盒机制如何限制文件读写权限? 3. 使用`nohup`时如何正确捕获输出日志? 4. APFS文件系统与传统EXT4在权限管理上有何区别? 5. 哪些iOS目录允许普通用户写入? [^1]: iOS系统分区挂载参数详见《iOS安全白皮书》第4章。 [^2]: 沙盒访问规则参考Apple Developer文档《App Sandboxing》。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值