为什么在分类中声明属性时,运行不会出错呢?
既然分类不让添加属性,那为什么我写了@property仍然还以编译通过呢?
我们知道在一个类中用@property声明属性,编译器会自动帮我们生成_成员变量和setter/getter,但分类的指针结构体中,根本没有属性列表。所以在分类中用@property声明属性,既无法生成_成员变量也无法生成setter/getter。
因此结论是:我们可以用@property声明属性,编译和运行都会通过,只要不使用程序也不会崩溃。但如果调用了_成员变量和setter/getter方法,报错就 在所难免 了。
既然报错的根本原因是使用了系统没有生成的setter/getter方法,可不可以在手动添加setter/getter来避免崩溃,完成调用呢?
其实是可以的。由于OC是动态语言,方法真正的实现是通过runtime完成的,虽然系统不给我们生成setter/getter,但我们可以通过runtime手动添加setter/getter方法。那具体怎么实现呢?
按照这个思路,我们通过运行时手动添加这个方法。
#import <objc/runtime.h>
static NSString *nameWithSetterGetterKey = @"nameWithSetterGetterKey" //定义一个key值
@implementation Programmer (Category)
//运行时实现setter方法
- (void)setNameWithSetterGetter:(NSString *)nameWithSetterGetter {
objc_setAssociatedObject(self, &nameWithSetterGetterKey, nameWithSetterGetter, OBJC_ASSOCIATION_COPY)
}
//运行时实现getter方法
- (NSString *)nameWithSetterGetter {
return objc_getAssociatedObject(self, &nameWithSetterGetterKey)
}
@end
attrib为dos下修改文件属性的命令,其格式如下: ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [drive:][path][filename] [/S [/D]] 参数说明: + 设定属性; - 清除属性; R 只读; A 存档; S 系统文件; H 隐藏; [drive:][path][filename]指定欲改变属性的文件夹或文件的路径,省略drive:,path时,默认为当前路径; /S 处理当前文件夹和子文件夹中所有的文件; /D 处理的项目包括子文件夹。 注意:修改除隐藏外的其他属性时,文件应为非隐藏! 比如:你想给文件c:\xxx.ext加上只读和隐藏属性,可以这样写:attrib +r +h c:\xxx.ext 去除改为-号就好了。 在C语言下使用system("attrib +r +h c:\\xxx.ext")来完成,代码如下: #include<stdio.h>#include <stdlib.h>void main() { system("attrib +r c:\\data.txt")}欢迎分享,转载请注明来源:内存溢出
评论列表(0条)