iOS基础类及@property属性

一、instancetype与id

 instancetype只用于返回当前类对象,若接收的对象不是当前类时,编译器会报警告(Incompatible pointer types initializing 'NSString *' with an expression of type 'JZPerson *')例如:NSString* person = [JZPerson person]。而且类对象只能调用当前类的对象方法,若调用的方法不存在,编译器直接报错。

id是万能指针,其声明的对象可接收任何类型,而且对象也可以随意调用任何类的方法,无论是否存在,这样会导致编译时可能不会报错,等到运行时会找不到方法而导致崩溃。id不仅可以返回类对象类型,而且还可以作为函数中参数变量的类型。

 

二、setter与getter方法

@property (copy, nonatomic) NSString* name;当我们声明这个属性时,系统会默认帮我们生成setName和getName方法以及一个_name的实例变量。但是当我们自己重写实现set和get方法后,此时系统将会把_name实例变量去掉。

@synthesize

用法一:

/**   JZPerson.h  **/
@interface JZPerson : NSObject

@property (copy, nonatomic) NSString* name;

@end

/**   JZPerson.m  **/
@implementation JZPerson

@synthesize age; // 作用:告诉系统去自动生成set和get方法,也就是这段代码可以不写!

@end

用法二:

/**  JZPerson.m   **/
@implementation JZPerson

/** 
 **   作用:
 **   1.当我们不重写set和get方法时,则让系统默认生成。
 **   2.重写,_name则是生成一个私有的变量,方便调用,不然此时系统默认的_name不再生成,而且这里如 **      果调用了self.name,则是调用自身,会导致死循环。
 **/
@synthesize name = _name; 

- (void)setName:(NSString *)name {
    _name = @"helloWorld";
}

- (NSString *)name {
    return _name;
}

@end

@dynamic

@implementation JZPerson
@dynamic name; // 作用: 必须重写set和get方法,不写报错!!

- (void)setName:(NSString *)name {
    //做一些操作
}

- (NSString *)name {
    return @"helloWorld";
}

@end

三、@property属性

assign:用于基本数据类型,如CGFloat、NSInteger等。生成的数据存在于栈上,变量使用完成后内存将被系统回收。

copy:set方法时会拷贝生成新的内存地址,这点与strong不相同,strong只是简单的指针复制,所以字符串用copy。copy还用于字符类或集合类的不可变情况,即不是mutable的。

weak:用于对象的弱引用,生成的对象引用计数不增加。一般用于对象互相引用或代理的情况。

扫描二维码关注公众号,回复: 3108225 查看本文章

strong:强引用着对象,引用计数加1,用于对象类型,字符串或集合类的可变情况。

猜你喜欢

转载自blog.csdn.net/jbr5740/article/details/82557971