Soru Amaç C statik sınıf değişkenleri


Objective C'ye yeni geldim ve Steven Holzner, Peachpit Press'in "Visual Quickstart Guide: Objective-C" adlı kitabını okuyorum

Bölüm 6: Nesne Yönelimli Programlamada, Sınıf Değişkenlerini Kullanma adlı bir bölüm bulunmaktadır.

İle kullanmak için sınıf değişkenleri oluşturabilirsiniz.   sınıfların, ama bir aksama var: her nesne   Bu sınıfın aynı değişkeni paylaşması   Bir nesne bir sınıf değişkenini değiştirirse,   Tüm nesneler için değişken değiştirildi. Sen yarat   Statik anahtar kelime ile sınıf değişkenleri.   Sınıf değişkenleri genellikle yararlıdır:   takip etmek için bir sınıf değişkeni kullanabilirsiniz   belirli bir sınıfa ait nesne sayısı oluşturuldu   bir programda. Bunu bu görevde yapacaksınız.

Ve aşağıdaki kodu girmeyi söylüyor:

#import <stdio.h>
#import <Foundation/NSObject.h>
@interface TheClass: NSObject
static int count; //error: cannot declare variable inside @interface or @protocol
+(int) getCount;
@end
...

Bu kod bana Xcode 4'te bir hata veriyor:

@İnterface veya @protocol öğesinde değişken bildirilemez

Kitap yanlış mı yoksa yanlış bir şey mi yapıyorum?


44
2018-05-17 19:07


Menşei


Kitap tamamen yanlıştır, Objective-C'de sınıf değişkeni kavramı yoktur. Statik değişkenleri C dilinde yapacağı şekilde bildirebilirsiniz, ancak sınıflara ait değildir (en azından semantik olarak değil). - BoltClock♦


Cevaplar:


Statik değişkeni uygulama dosyasında bildirirsiniz (.m dosya). Bu çalışmalı:

// TheClass.h
@interface TheClass : NSObject
+ (int)count;
@end

// TheClass.m
static int theCount = 0;

@implementation TheClass
+ (int) count { return theCount; }
@end

Kendi başına bir sınıf değişkeni değil; Objective-C'nin bir sınıf değişkenine dair bir fikri yoktur. Bununla birlikte, bu değişkeni almak için sınıf yöntemiyle birleştiğinde, bir sınıf değişkenine benzer şekilde çalışır. Bununla birlikte, bu gerçekten sınıfın uygulaması tarafından erişilebilen bir C statik değişkendir.


95
2018-05-17 19:13



"Sınıf değişkeni", bazı başlatma gerektiren bir nesne ise (NSSet) ise ne olur? - Uri
@mipadi - Lütfen bana açıklık getirin. Bir "sınıf değişkeninin" tanımından emin değilim ve bu yüzden neden "sınıf değişkeni olmadığını" anladığımdan emin değilim. Uygulama dosyasında bildirilen statik bir değişken, sınıfın tüm örnekleri tarafından paylaşılır ve yalnızca bu sınıfın örnekleriyle erişilebilir. Alt sınıflar tarafından erişilemediğinden bir "sınıf değişkeni" değil mi? Yoksa ayrımı yaptığınız başka bir sebep var mı? İçtenlikle öğrenmek isterim. - Chuck Krutsinger
@ Chuck-Krutsinger Kimsenin cevap vermediği gibi: Bir sınıf değişkeni kavramı, bir sınıf yöntemiyle (ama bir değişken), yani bir sınıfın bir örneğini oluşturmadan erişilebilen bir değişkenin aynısıdır; uygulamada değişken yapabilirdi. 'Sınıf değişkeni' terimini kullanmasının nedeni, sorunun ne olduğuyla ilgili olduğu içindir, ancak bunlar mevcut değil çünkü statik zaten gerekli işlevselliği sağlar. - Simon Jackson
Sınıf için '' + (void) '' initialize '' (Java ya da C # 'da statik bir yapıcının analogu) kullanın. - Julian Gold
Hey, bir süre önce ARC uyumlu değil, ama ata yöntemlerini kullanarak ve güçlü veya zayıf referanslar belirterek ARC'de kullanılabilir. gist.github.com/darionco/03649feeee57f86fee3f - Dario


Unix hakkında bir Görsel Hızlı Başlangıç ​​Kılavuzu gördüm ve çok zaman geçirdi. Bu, en azından örneklemden daha iyi görünmüyor. Objective-C'de bir sınıf değişkeni yaratmanın doğru yolu şuna benzer:

// Counted.h
@interface Counted : NSObject

+ (NSUInteger) numberOfInstances;

@end

// Counted.m
#import "Counted.h"

static NSUInteger instances = 0;

@implementation Counted

- (id) init {
    …
    instances++;
    …
}

- (void) dealloc {
    instances--;
}

+ (NSUInteger) numberOfInstances {
    return instances;
}

@end

Bu aslında bir statik değişken, gerçek bir sınıf değişkeni değil. Ama yine de sınıf değişkenleri hakkında çok fazla endişelenmemelisiniz, genellikle yanlış bir şey yaptığınızı gösteren bir işarettirler. (Ben biraz basitleştiriyorum, ama fazla değil.)

İyi bir Objective-C kitabı arıyorsanız, okuyun Apple tarafından. Bu ücretsizdir ve iyi bir okuma.


15
2018-05-17 19:13





"Sınıf değişkeni" önemsiz başlatmadan daha fazlasına ihtiyaç duyarsa dispatch_once:

@interface Foo ()
+ (Foo *)singleton;
@end

+ (Foo *)singleton {
    static Foo *_singleton;
    static dispatch_once_t oncePredicate;

    dispatch_once(&oncePredicate, ^{
        _singleton = [[Foo alloc] init];
    });

    return _singleton;
}

9
2018-03-14 15:19





Değişkeni @implementation'ın yerleştirildiği .m dosyasında bildirmelisiniz. Yani,

#import "TheClass.h"

static int count;

@implementation

...

@end

Objective-C'nin aslında sınıf değişkenlerini desteklemediğini unutmamak önemlidir. Ama burada yaptığımız gibi onları statik değişkenlerle simüle edebilirsiniz.


6
2018-05-17 19:18