Amaç-C Yapıları
Objective-C dizileri, aynı türden birkaç veri öğesini tutabilen değişken türlerini tanımlamanıza izin verir, ancak structure Objective-C programlamasında bulunan ve farklı türlerdeki veri öğelerini birleştirmenize olanak tanıyan kullanıcı tanımlı başka bir veri türüdür.
Yapılar bir kaydı temsil etmek için kullanılır, Farz edin ki kitaplarınızı bir kütüphanede takip etmek istiyorsunuz. Her kitapla ilgili aşağıdaki öznitelikleri izlemek isteyebilirsiniz -
- Title
- Author
- Subject
- Kitap kimliği
Bir Yapının Tanımlanması
Bir yapıyı tanımlamak için, structBeyan. Struct deyimi, programınız için birden fazla üye içeren yeni bir veri türünü tanımlar. Struct ifadesinin biçimi aşağıda gösterilmiştir -
struct [structure tag] {
member definition;
member definition;
...
member definition;
} [one or more structure variables];
structure tagisteğe bağlıdır ve her üye tanımı, int i gibi normal bir değişken tanımıdır; veya float f; veya başka herhangi bir geçerli değişken tanımı. Yapının tanımının sonunda, son noktalı virgülden önce, bir veya daha fazla yapı değişkeni belirtebilirsiniz, ancak bu isteğe bağlıdır. Kitap yapısını şu şekilde beyan edersiniz:
struct Books {
NSString *title;
NSString *author;
NSString *subject;
int book_id;
} book;
Yapı Üyelerine Erişim
Bir yapının herhangi bir üyesine erişmek için, member access operator (.). Üye erişim operatörü, yapı değişkeni adı ile erişmek istediğimiz yapı üyesi arasında bir süre olarak kodlanır. Kullanırdınstructyapı tipindeki değişkenleri tanımlamak için anahtar kelime. Aşağıda yapının kullanımını açıklamak için örnek verilmiştir -
#import <Foundation/Foundation.h>
struct Books {
NSString *title;
NSString *author;
NSString *subject;
int book_id;
};
int main() {
struct Books Book1; /* Declare Book1 of type Book */
struct Books Book2; /* Declare Book2 of type Book */
/* book 1 specification */
Book1.title = @"Objective-C Programming";
Book1.author = @"Nuha Ali";
Book1.subject = @"Objective-C Programming Tutorial";
Book1.book_id = 6495407;
/* book 2 specification */
Book2.title = @"Telecom Billing";
Book2.author = @"Zara Ali";
Book2.subject = @"Telecom Billing Tutorial";
Book2.book_id = 6495700;
/* print Book1 info */
NSLog(@"Book 1 title : %@\n", Book1.title);
NSLog(@"Book 1 author : %@\n", Book1.author);
NSLog(@"Book 1 subject : %@\n", Book1.subject);
NSLog(@"Book 1 book_id : %d\n", Book1.book_id);
/* print Book2 info */
NSLog(@"Book 2 title : %@\n", Book2.title);
NSLog(@"Book 2 author : %@\n", Book2.author);
NSLog(@"Book 2 subject : %@\n", Book2.subject);
NSLog(@"Book 2 book_id : %d\n", Book2.book_id);
return 0;
}
Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -
2013-09-14 04:20:07.947 demo[20591] Book 1 title : Objective-C Programming
2013-09-14 04:20:07.947 demo[20591] Book 1 author : Nuha Ali
2013-09-14 04:20:07.947 demo[20591] Book 1 subject : Objective-C Programming Tutorial
2013-09-14 04:20:07.947 demo[20591] Book 1 book_id : 6495407
2013-09-14 04:20:07.947 demo[20591] Book 2 title : Telecom Billing
2013-09-14 04:20:07.947 demo[20591] Book 2 author : Zara Ali
2013-09-14 04:20:07.947 demo[20591] Book 2 subject : Telecom Billing Tutorial
2013-09-14 04:20:07.947 demo[20591] Book 2 book_id : 6495700
Fonksiyon Bağımsız Değişkenleri Olarak Yapılar
Bir yapıyı, başka bir değişken veya işaretçi ilettiğinize çok benzer bir şekilde işlev bağımsız değişkeni olarak iletebilirsiniz. Yapı değişkenlerine yukarıdaki örnekte eriştiğiniz şekilde erişirsiniz -
#import <Foundation/Foundation.h>
struct Books {
NSString *title;
NSString *author;
NSString *subject;
int book_id;
};
@interface SampleClass:NSObject
/* function declaration */
- (void) printBook:( struct Books) book ;
@end
@implementation SampleClass
- (void) printBook:( struct Books) book {
NSLog(@"Book title : %@\n", book.title);
NSLog(@"Book author : %@\n", book.author);
NSLog(@"Book subject : %@\n", book.subject);
NSLog(@"Book book_id : %d\n", book.book_id);
}
@end
int main() {
struct Books Book1; /* Declare Book1 of type Book */
struct Books Book2; /* Declare Book2 of type Book */
/* book 1 specification */
Book1.title = @"Objective-C Programming";
Book1.author = @"Nuha Ali";
Book1.subject = @"Objective-C Programming Tutorial";
Book1.book_id = 6495407;
/* book 2 specification */
Book2.title = @"Telecom Billing";
Book2.author = @"Zara Ali";
Book2.subject = @"Telecom Billing Tutorial";
Book2.book_id = 6495700;
SampleClass *sampleClass = [[SampleClass alloc]init];
/* print Book1 info */
[sampleClass printBook: Book1];
/* Print Book2 info */
[sampleClass printBook: Book2];
return 0;
}
Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -
2013-09-14 04:34:45.725 demo[8060] Book title : Objective-C Programming
2013-09-14 04:34:45.725 demo[8060] Book author : Nuha Ali
2013-09-14 04:34:45.725 demo[8060] Book subject : Objective-C Programming Tutorial
2013-09-14 04:34:45.725 demo[8060] Book book_id : 6495407
2013-09-14 04:34:45.725 demo[8060] Book title : Telecom Billing
2013-09-14 04:34:45.725 demo[8060] Book author : Zara Ali
2013-09-14 04:34:45.725 demo[8060] Book subject : Telecom Billing Tutorial
2013-09-14 04:34:45.725 demo[8060] Book book_id : 6495700
Yapılara İşaretçiler
Başka bir değişkene işaretçi tanımladığınız gibi, yapılara işaretçileri aşağıdaki gibi tanımlayabilirsiniz -
struct Books *struct_pointer;
Şimdi, bir yapı değişkeninin adresini yukarıda tanımlanan işaretçi değişkeninde saklayabilirsiniz. Bir yapı değişkeninin adresini bulmak için, & operatörünü yapının adının önüne aşağıdaki gibi yerleştirin -
struct_pointer = &Book1;
Bir yapının üyelerine, o yapının bir işaretçisi kullanarak erişmek için, -> operatörünü aşağıdaki gibi kullanmanız gerekir -
struct_pointer->title;
Yapı işaretçisini kullanarak yukarıdaki örneği yeniden yazalım, bunun sizin için kavramı anlamanızın kolay olacağını umalım -
#import <Foundation/Foundation.h>
struct Books {
NSString *title;
NSString *author;
NSString *subject;
int book_id;
};
@interface SampleClass:NSObject
/* function declaration */
- (void) printBook:( struct Books *) book ;
@end
@implementation SampleClass
- (void) printBook:( struct Books *) book {
NSLog(@"Book title : %@\n", book->title);
NSLog(@"Book author : %@\n", book->author);
NSLog(@"Book subject : %@\n", book->subject);
NSLog(@"Book book_id : %d\n", book->book_id);
}
@end
int main() {
struct Books Book1; /* Declare Book1 of type Book */
struct Books Book2; /* Declare Book2 of type Book */
/* book 1 specification */
Book1.title = @"Objective-C Programming";
Book1.author = @"Nuha Ali";
Book1.subject = @"Objective-C Programming Tutorial";
Book1.book_id = 6495407;
/* book 2 specification */
Book2.title = @"Telecom Billing";
Book2.author = @"Zara Ali";
Book2.subject = @"Telecom Billing Tutorial";
Book2.book_id = 6495700;
SampleClass *sampleClass = [[SampleClass alloc]init];
/* print Book1 info by passing address of Book1 */
[sampleClass printBook:&Book1];
/* print Book2 info by passing address of Book2 */
[sampleClass printBook:&Book2];
return 0;
}
Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -
2013-09-14 04:38:13.942 demo[20745] Book title : Objective-C Programming
2013-09-14 04:38:13.942 demo[20745] Book author : Nuha Ali
2013-09-14 04:38:13.942 demo[20745] Book subject : Objective-C Programming Tutorial
2013-09-14 04:38:13.942 demo[20745] Book book_id : 6495407
2013-09-14 04:38:13.942 demo[20745] Book title : Telecom Billing
2013-09-14 04:38:13.942 demo[20745] Book author : Zara Ali
2013-09-14 04:38:13.942 demo[20745] Book subject : Telecom Billing Tutorial
2013-09-14 04:38:13.942 demo[20745] Book book_id : 6495700
Bit Alanları
Bit Alanları, bir yapıda verilerin paketlenmesine izin verir. Bu, özellikle bellek veya veri depolamanın önemli olduğu durumlarda kullanışlıdır. Tipik örnekler -
Birkaç nesneyi bir makine kelimesine paketlemek. örneğin 1 bitlik bayraklar sıkıştırılabilir.
Harici dosya formatlarını okuma - standart olmayan dosya formatları okunabilir. Örn. 9 bitlik tamsayılar.
Objective-C, değişkenden sonra bit uzunluğu koyarak bunu bir yapı tanımında yapmamıza izin verir. Örneğin -
struct packed_struct {
unsigned int f1:1;
unsigned int f2:1;
unsigned int f3:1;
unsigned int f4:1;
unsigned int type:4;
unsigned int my_int:9;
} pack;
Burada, paketlenmiş yapı 6 üye içerir: Dört adet 1 bitlik bayrak f1..f3, 4 bitlik bir tür ve 9 bitlik my_int.
Objective-C, alanın maksimum uzunluğunun bilgisayarın tamsayı kelime uzunluğundan daha az veya ona eşit olması koşuluyla, yukarıdaki bit alanlarını olabildiğince kompakt bir şekilde otomatik olarak paketler. Durum böyle değilse, bazı derleyiciler alanlar için bellek örtüşmesine izin verirken, diğerleri sonraki kelimede sonraki alanı saklayabilir.