Foundation中NSMutableObject能否用copy

来源:互联网 发布:mac book pro 201515.4 编辑:程序博客网 时间:2024/06/05 19:20

一、如下报错

-[__NSArray0 removeAllObjects]: unrecognized selector sent to instance 0x14e14970

项目中会很多时候遇到这样的报错,原因很简单:是我们用copy修饰符修饰了Foundation中的NSMutableObject对象

@property (nonatomic, copy)NSMutableArray *mutArrayA;@property (nonatomic, strong)NSMutableArray *mutArrayB;NSMutableArray *c = [NSMutableArray array];self.mutArrayA = c;self.mutArrayB = c;NSLog(@"---A--------%@", [self.mutArrayA class]);NSLog(@"---B--------%@", [self.mutArrayB class]);
[5628:1141282] ---A--------__NSArray0[5628:1141282] ---B--------__NSArrayM

从上面的代码可以看出:copy修饰符会把源对象的值copy一份给它所修饰的对象;strong修饰符会直接指向源对象,会和源对象的类型保持一致。

所以在开发中,建议把NSMutableObject用strong修饰



二、创建oc文件时category和Extension选项的作用

创建oc文件的选项


1、选择category创建
这里写图片描述

这是个分类,可以在不修改原来类的基础上,为一个类扩展方法。不能在分类里给对象添加属性。

分类中可以访问原来类中的成员变量,但是只能访问@protect和@public形式的变量。如果想要访问本类中的私有变量,分类和子类一样,只能通过方法来访问。

通过runtime给一个分类添加属性

.h文件#import <UIKit/UIKit.h>@interface UIView (ZMView)@property (nonatomic, strong)UILabel *label;@end
.m文件#import "UIView+ZMView.h"#import <objc/runtime.h>@implementation UIView (ZMView)static NSString *labelKey = @"labelKey";- (UILabel *)label {    UILabel *label = objc_getAssociatedObject(self, &labelKey);    return label;}- (void)setLabel:(UILabel *)Label {    objc_setAssociatedObject(self, &labelKey, Label, OBJC_ASSOCIATION_RETAIN);}@end



2、选择Extension创建
这里写图片描述

创建的是类扩展,也称为匿名分类,一般用于为类添加属性和方法。

#import <UIKit/UIKit.h>@interface UIView (){    NSString *_str;}@property (nonatomic, strong)UILabel *label;- (void)test;@end

可以在匿名分类里添加实例常量、属性、方法等,在分类里不能添加属性。一般匿名分类里面的东西都是私有化的,在项目开发中我们经常会这样使用,而不是创建文件。

原创粉丝点击