-
关键字
-
nonlabel:可能为空。作用:一般用于属性声明时使用
-
1.@property(nonatomic,copy,nullable)NSstring * name;//name字符串可以为空。
-
2.@property(nonatomic,copy)NSstring *_Nullable name;
-
nonnull:不能为空。作用:一般用于属性声明时使用
-
1.@property(nonatomic,copy,nonnull)NSstring * name;//name字符串不可以为空,如果仍然赋值为空则会⚠️
-
2.@property(nonatomic,copy)NSstring *_Nonnull name;
-
null_resettable:必须要处理为空情况,建议重写get方法。作用:get方法不能返回nil,set可以传入为空。
-
@property (nonatomic, strong, null_resettable) NSString *name;
-
__kindof:相当于当前类或者它的子类 作用:举个🌰
-
咱们用instancetype,系统自动识别当前对象的类 + (instancetype)people 如果+(__kindof Person *)people,表示可以使people类或者它的子类
-
泛型
-
什么是泛型,简单来说就是限制一个类型中放什么东西。用法:类型<限制类型>
-
泛型的声明:在声明类的时候,在类的后面<泛型名称>,如果不用指定的泛型类型会⚠️。 @property (nonatomic, strong) NSMutableArray<NSString *> *arry;
-
泛型的好处:如果我现在_array或者self.arry,会有提示。如果从数据中取元素,可以使用点语法,id是不可以使用点语法的。
-
泛型注意点:在数组中,一般用可变数组添加方法,泛型才会生效,如果使用不可变数组,添加元素,泛型没有效果
-
泛型在开发中使用场景:用于限制集合类型,比如限制NSMutableArray、、NSMutableDictory等等
-
泛型中的协变和逆变
-
__covariant:协变, 子类转父类
-
__contravariant:逆变 父类转子类
//父类转子类
-(void)contravariant
{
iOS *ios = [[iOS alloc] init];
Language *language = [[Language alloc] init];
// 父类转子类
Person<Language *> *p = [[Person alloc] init];
p.language = language;
Person<iOS *> *p1 = [[Person alloc] init];
p1 = p;
}
// 子类转父类
- (void)covariant
{
iOS *ios = [[iOS alloc] init];
Language *language = [[Language alloc] init];
// iOS
Person<iOS *> *p = [[Person alloc] init];
p.language = ios;
Person<Language *> *p1;
p1 = p;
}
/**
SFSafariViewController官方默认的跳转方式是modal,如果强行用push返回的时候需要监听SFSafariViewController的代理方法,&&返回后导航栏会消失
&&使用SFSafariViewController的时候需要导入#import <SafariServices/SafariServices.h>,&&SFSafariViewController最低支持iOS9
*/
SFSafariViewController *safariVC = [[SFSafariViewController alloc]initWithURL:url];
[self presentViewController:safariVC animated:YES completion:nil];