2013-08-03 12 views
9

Kendimi büyük inek çiftliği kitabını kullanarak objektif-c öğretmeye çalışıyorum, gerçekten harika bir kitap ama bazı yönler beni şaşırtıyor.Objective-C setValue: forKey on c ilkel türleri

Geçerli bölüm, setOalue: forKey işlevini kullanmaktan bahsediyor, anladığım NSObject öğesinde tanımlanmış bir yöntem. kitap int veya şamandıra gibi ilkel ac bu kullanabilir söylüyor ve bu örnek verir

Ben Cihaz ve içinde adlandırılan özel sınıf voltajını saklayan gerilim adında tamsayı örneği değişkendir var geçerli cihaz Ben adlı yeni cihaz başlatmak bir

appliance *a = [[appliance alloc]init]; 
[a setValue:[NSNumber numberWithInt:240] forKey:@"voltage"]; 

o da voltajı için özel ayarlayıcı kurar ve onun o

-(void)setVoltage:int(x) { 
NSLog(@"setting voltage to %d",x); 
voltage =x; 
} 
çalışır kanıtlamak için adlandırılan gerilimi kaydeder

Bana kafa karıştırıcı olan NSNumber numberWithInt öğesinin, yığınta depolanan bir NSNumber nesnesine bir işaretçi döndürmesi doğru mu? Öyleyse,% d belirtecini kullanarak NSNumber'de depolanan tam sayıyı nasıl günlüğe kaydeder. Anladığım kadarıyla bir tamsayı kaydeder, ancak bir nesneye girilmez mi? ayrıca voltajın bir tamsayı olarak tanımlandığından ve bir şeye bir işaretçi olmadığı için, adresinin hafızasındaki bir nesneyi tutamayacağını düşündüm. ya da NSNumber, aslında bir işaretçi olarak beyan edilen voltaj olmadan bellek adresini tutmaya zorlanıyor mu? Karışıklık için özür dilerim bu bölüm temel olarak benim popomu başlattı.

+3

Normal kodlama uygulamalarında, * bir nesne üzerindeki değerleri ayarlamak/almak için * setValue: forKey: 'veya' valueForKey: 'işlevini kullanmazsınız. Sadece setter/getter'i doğrudan arayın. KVC büyük ölçüde, bağlamalar ve diğer meta programlama biçimleri gibi şeyleri desteklemek için var. – bbum

cevap

25

Nesneler ve skaler türleri arasındaki dönüşüm, Temel Değer Kodlama yöntemleri tarafından otomatik olarak işlenir. documentation kaynaktan: valueForKey: arasında

varsayılan uygulamaları ve setValue:forKey: olmayan obje verilerinin türleri, skalerler ve yapılar, her iki otomatik nesne sarma için destek sağlar. valueForKey: kez

belirli erişimci yöntemi veya belirtilen anahtarının değerini temin etmek için kullanıldığı örnek değişkeni belirlemiştir, bu dönüş türü veya veri türü inceler. döndürülecek değer bir nesne değilse, NSNumber veya NSValue nesnesi bu değer için oluşturulur ve yerine geri döndürülür.

Benzer şekilde, setValue:forKey:, belirtilen anahtar için uygun erişimci veya örnek değişkeni tarafından istenen veri türünü belirler. veri türü bir nesne değilse, değer -<type>Value yöntemini kullanarak geçirilen nesneden ayıklanır. Yani sizin durumda

, intValue geçti NSNumber nesneye otomatik olarak uygulanır ve elde edilen tamsayı setVoltage: geçirilir.

4

Bir NSNumber örneğini oluşturup bunu iletmeniz doğrudur. Ancak, setValue:forKey: numarasına geçiyorsunuz ve bu sizin için biraz iş yapıyor.voltage (setVoltage:) için uygun ayarlayıcı metodu bulmakta, veri tipini kontrol etmekte ve sayıyı ayarlayıcıyı çağırmadan önce int numarasına ayırmaktadır.