不知不觉,从事iOS相关工作将近7年了,这里对iOS的一些基础知识进行一个简单的整理归纳。
1、Objective-C的类可以多重继承么?可以实现多个接口么?
Objective-C不支持直接
的多重继承,但是可以通过协议(Protocol)
来达到类似的效果。Objective-C的类可以通过遵循多个协议,从而具备多个接口的能力。
// 定义一个协议
@protocol Flying
- (void)fly;
@end
@protocol Swimming
- (void)swim;
@end
// 定义一个类,遵循 Flying 和 Swimming 协议
@interface Bird : NSObject <Flying, Swimming>
@end
@implementation Bird
- (void)fly {
NSLog(@"Bird is flying");
}
- (void)swim {
NSLog(@"Bird is swimming");
}
@end
我们可以看到,Bird
类遵循了两个协议Flying
和Swimming
,从而具备了飞行和游泳的能力。通过协议的使用,可以使类在行为上具备多个接口的特性。这种方式有助于避免经典的多重继承问题,同时保持了一定的灵活性。
2、Category是什么?重写一个类的方式用继承好还是分类好?为什么?
继承
// 通过继承实现扩展
@interface MyExtendedString : NSString
- (NSString *)myCustomMethod;
@end
@implementation MyExtendedString
- (NSString *)myCustomMethod {
return [self stringByAppendingString:@" - Customized"];
}
@end
Category
// 通过Category实现扩展
@interface NSString (MyCategory)
- (NSString *)myCustomMethod;
@end
@implementation NSString (MyCategory)
- (NSString *)myCustomMethod {
return [self stringByAppendingString:@" - Customized"];
}
@end
使用继承
- 优点:可以重写已有的方法,允许添加新的属性
- 缺点:有时可能引入类层次结构的复杂性,可能导致不必要的耦合。
使用Category
- 优点:不引入新的类层次结构,更灵活,允许在运行时为现有类添加功能。
- 缺点:无法添加新的实例变量,无法重写已有方法。
综上所诉
:
- 如果你需要添加新的属性,或者重写已有的方法,使用
继承
可能更合适。 - 如果你只需为类添加新的方法而不涉及修改属性或已有方法,使用
Category
通常更灵活
3、@property有什么用?
在Objective-C中,@property
用于声明类的属性,提供了一种简化访问对象实例变量的方式,并为对象的成员变量(ivar
)提供了封装。使用@property
声明的属性,可以自动合成getter
和setter
方法,并支持不同的属性修饰符。
提高了代码的简洁性,还带来了更好的封装性和可读性,开发者更方便地访问和修改对象的属性。
4、@property常用的属性和关键字有哪些?
-
nonatomic
:表示属性是非原子性
的,可能会在中途被其他线程打断
。在多线程环境中,非原子属性的读写操作不是线程安全的
,但通常会更加高效
。
@property (nonatomic, strong) NSString *name;
-
atomic
:是默认的属性修饰符。它保证了对属性的读写操作是原子性
的,即在进行读写操作时,不会被线程中断。对该属性的读写是线程安全
的,但性能上会有一些损失
。
@property (atomic, strong) NSString *name;
-
strong
:表示对属性进行强引用
。在ARC中,这是默认的引用修饰符。
@property (nonatomic, strong) NSString *name;
-
weak
:表示对属性进行弱引用
。弱引用
不会保持对象的拥有权,当被引用的对象被释放时,弱引用会自动置为nil
。
@property (nonatomic, weak) id delegate;
-
assign
:用于基本数据类型(如NSInteger
、CGFloat
等)的属性,表示进行赋值操作而不进行引用计数的增减。
@property (nonatomic, assign) NSInteger count;
-
copy
:表示进行属性赋值时进行一次copy
操作。通常用于不可变对象
的属性,以确保属性值的不可变性
。
@property (nonatomic, copy) NSString *title;
-
readonly
:只读特性,表示只生成
属性的getter
方法,不生成setter
方法,不希望属性在类外改变。
@property (nonatomic, readonly) NSString *readOnlyProperty;
-
readwrite
:可读可写特性,生成属性的setter
和getter
方法。
@property (nonatomic, readwrite) NSString *readWriteProperty;
-
getter
:用于指定生成的getter
方法的名称
@property (nonatomic, getter=getCustomGetter) NSString *customProperty;
-
setter
:用于指定生成的setter
方法的名称。
@property (nonatomic, setter=setCustomSetter:) NSString *customProperty;
5、Objective-C常见的数据类型有哪些?和C的基本数据类型有什么区别?
Objective-C常见的数据类型包括基本数据类型
、对象类型
和结构体类型
。与C的基本数据类型相比,Objective-C添加了对象类型
,并在语法上进行了扩展,使其更适用于面向对象的编程。
a、基本数据类型:
-
整数类型
int
、short
、long
、long long
NSInteger
(Objective-C中用于表示整数的类型) -
浮点数类型
float
、double
CGFloat
(Objective-C中用于表示浮点数的类型) -
字符类型
char
Bool
(Objective-C中用于表示布尔值的类型)
b、对象类型:
-
指针类型
id
(通用对象类型,可以指向任意类型的对象)
Class
(表示类的类型) -
NSString类型
用于处理字符串的对象类型 -
NSArray
、NSDictionary
、NSSet
等集合类型:
用于处理集合的对象类型
c、 结构体类型:
-
CGPoint
、CGSize
、CGRect
用于表示图形界面中的点、大小和矩形 -
NSRange
用于表示一段范围的结构体
与C的基本数据类型的区别
:
1、引入了对象类型
:Objective-C引入了对象类型,允许使用类和对象,使得编程更加面向对象。
2、使用了动态运行时特性
:Objective-C是一门动态语言,它的运行时系统允许在运行时进行多操作,如消息传递
、动态类型识别
等
3、语法上的扩展
:Objective-C的语法对C进行了扩展,添加了面向对象编程的特性,如方法调用
、消息传递
、继承
等
4、增加了一些特殊的关键字
:Objective-C引入了一些特殊的关键字,如nil
用于表示空对象,YES
和NO
用于表示布尔值。