Middle
Оё имкон дорад арзиш дар кӯпча бошад ва истинод дар стек? Нуқтаи назари худро шарҳ диҳед.
sobes.tech AI
Ҷавоб аз AI
Әйе, бу стандартлы тәртип.
- Тек: Локаль үзгәрүчеләрне һәм объектларга сылтамаларны саклый. Тектагы мәгълүматның гомер озынлыгы функциянең яки код блогының даирәсе белән бәйләнгән. Мәгълүматка керү тиз.
- Куча (Heap): Динамик рәвештә ясалган объектларны саклый. Кучадагы мәгълүматның гомер озынлыгы даирәгә бәйле түгел һәм хәтер идарәсе механизмы (ARC iOS-та) белән идарә ителә. Мәгълүматка керү әлегә тизрәк түгел.
Без Swiftта класс объекты ясаганда (мәсәлән), объект үзәге кучада урнаша. Без аңа саклау өчен билгели торган үзгәрүче, нигездә, кучадагы мәгълүматка сылтама (юл) булып тора һәм ул стекта саклана.
Swiftта мисал:
// MyObject — класс (референс тибы), кучада урнаша
class MyObject {
var name: String
init(name: String) {
self.name = name
}
}
func myFunction() {
// myObject — стекта урнашкан үзгәрүче, ул MyObject экземплярына сылтама
// кучада
let myObject = MyObject(name: "Test")
// ... myObject куллану ...
} // myObject (сылтама) функциядән чыгу белән стектан юкка чыга
// MyObject экземпляры ARC белән юкка чыга, әгәр көчле сылтамалар калмаса
Objective-Cта охшаш:
// MyObject — класс (референс тибы), кучада урнаша
@interface MyObject : NSObject
@property (nonatomic, strong) NSString *name;
- (instancetype)initWithName:(NSString *)name;
@end
@implementation MyObject
- (instancetype)initWithName:(NSString *)name {
self = [super init];
if (self) {
_name = name;
}
return self;
}
@end
void myFunction() {
// myObject — стекта урнашкан үзгәрүче, ул MyObject экземплярына сылтама
// кучада
MyObject *myObject = [[MyObject alloc] initWithName:@"Test"];
// ... myObject куллану ...
} // myObject (сылтама) функциядән чыгу белән стектан юкка чыга
// MyObject экземпляры ARC белән юкка чыга, әгәр көчле сылтамалар калмаса
Ике очракта да myObject үзгәрүчесе стекта урнашкан, ә MyObject объекты — кучада. myObject үзгәрүчесе хәтер адресын саклый, анда кучадагы объект урнашкан.