博客> self.xx  _xx 的区别 — setValue和setObject的区别
self.xx  _xx 的区别 — setValue和setObject的区别
2019-10-12 07:35 评论:0 阅读:713 nice_future
setValue setObject self.xx _xx

前者调用该类的setter或getter方法,后者直接获取自己的实例变量。

property 和 instance variable 是有区别的。

前者声明后,如果没有readonly修饰的话,该类获得两个方法,一个是setter和getter。property声明后,该类会获得一个同名但前面多了一个下划线的实例变量。setter和getter是访问这个实例变量的方法。

在类的m文件里可以直接用实例变量名来访问自身的实例变量,但是setter和getter方法不会被调用。外部想用该类的实例变量需要用getter和setter方法。

setValue和setObject的区别 在使用NSMutableDictionary的时候经常会使用setValue forKey与setObject forKey,他们经常是可以交互使用的,代码中经常每一种的使用都有。 1,先看看setValue: forKey:的定义 @interface NSMutableDictionary(NSKeyValueCoding) / Send -setObject:forKey: to the receiver, unless the value is nil, in which case send -removeObject:forKey:. /

  • (void)setValue:(id)value forKey:(NSString *)key; @end 扩展NSMutableDictionary的一个类别,上面注释说的很清楚,发送setObject:forKey 给接收者,也就是调用setObject:forKey方法 除非value为nil的时候,调用方法removeObject:forKey

2,看看setObject:forKey:的定义 @interface NSMutableDictionary :NSDictionary

  • (void)removeObjectForKey:(id)aKey;
  • (void)setObject:(id)anObject forKey:(id )aKey; @end 注意:setObject:forKey:中Key的对象是一个id类型,并不是NSString,只不过我们经常使用NSString而已。

现在总结他们2者的区别就是: 1, setObject:forkey:中value是不能够为nil的,不然会报错。 setValue:forKey:中value能够为nil,但是当value为nil的时候,会自动调用removeObject:forKey方法 2, setValue:forKey:中key的参数只能够是NSString类型,而setObject:forKey:的可以是任何类型

注意:setObject:forKey:对象不能存放nil要与下面的这种情况区分: 1, [imageDictionarysetObject:[NSNullnull] forKey:indexNumber]; [NSNull null]表示的是一个空对象,并不是nil,注意这点

2, setObject:forKey:中Key是NSNumber对象的时候,如下: [imageDictionarysetObject:obj forKey:[NSNumber numberWithInt:10]];

注意: 上面说的区别是针对调用者是dictionary而言的。 setObject:forKey:方法NSMutabledictionary特有的,而 setValue:forKey:方法是KVC(键-值编码)的主要方法。

当 setValue:forKey:方法调用者是对象的时候: setValue:forKey:方法是在NSObject对象中创建的,也就是说所有的oc对象都有这个方法,所以可以用于任何类。 比如使用: SomeClass *someObj = [[SomeClass alloc] init]; [someObj setValue:self forKey:@"delegate"];

表示的意思是:对象someObj设置他的delegate属性的值为当前类,当然调用此方法的对象必须要有delegate属性才能设置,不然调用了也没效果

id 和 instancetype 相同点 : 都可作为方法的返回类型 不同点 : 1、 instancetype 可以返回该方法所在类相同类型的对象, id 只能返回未知类型的对象

  1. interface NSArray
    • (id)constructAnArray;
  2. @end
    当我们使用如下方式初始化NSArray时: [objc] view plaincopy

  3. [NSArray constructAnArray];
    根据Cocoa的方法命名规范,得到的返回类型就和方法声明的返回类型一样,是id。

但是如果使用instancetype作为返回类型,如下: [objc] view plaincopy

  1. @interface NSArray
    • (instancetype)constructAnArray;
  2. @end
    当使用相同方式初始化NSArray时: [objc] view plaincopy

  3. [NSArray constructAnArray];
    得到的返回类型和方法所在类的类型相同,是NSArray*! 总结起来就是,instancetype 的所用: 使那些非关联返回类型的方法返回所在类的类型

2、 instancetype 只能作为返回值,不能像id那样也可作为参数,如

    • (void)setValue:(instancetype)value
  1. {
  2. //do something
  3. }
    就是错的,应该写成: [objc] view plaincopy

    • (void)setValue:(id)value
  4. {
  5. //do something
  6. }
收藏
0
sina weixin mail 回到顶部