2009-02-26 36 views
7

Tôi đã thấy rất nhiều bài nói về nhập động trong mục tiêu-c. Nhưng tôi đã không nhìn thấy bất kỳ ví dụ về những gì tôi nghĩ rằng nó được cho là.Cách phân bổ đối tượng được nhập động

cho phép nói rằng tôi có một chức năng chung được cho là sắp xếp hai đối tượng (một được cấp phát và một đối tượng khác được giải phóng) và đối tượng gọi sẽ tự gắn nó với đối tượng mới được phân bổ. Cả hai đều được kế thừa từ class0

Vui lòng giải thích điều này tuy nhiên bạn muốn nếu bạn nghĩ nó sẽ giải thích điều gì đó !!

Nếu lớp được chọn khi chạy, làm cách nào để xử lý danh sách đối số (? Là trình giữ chỗ cho bây giờ) Làm cách nào để phân bổ một đối tượng không được xác định cho đến khi chạy?

-(void) juggle:(?*)objclass1:(?*)objclass2{ 

? temp = [? alloc] init]; 
objclass1 = temp; 
[temp release]; 

[objclass2.view removefromsuperview]; 
[self.handle insertsubview:objclass1.view]; 

} 

Trả lời

19

Tôi không biết mã bạn đang làm ở đó là gì, nó không hợp lệ về mặt cú pháp và thao tác chế độ xem không liên quan gì đến câu hỏi của bạn. Dù sao, nếu bạn thực sự không biết loại bạn thường sử dụng "id" là loại đúc thành một "void *" cho codegen. Nó có thuộc tính đặc biệt mà nó được giả định nhận bất kỳ thông báo nào, do đó nó không kích hoạt các cảnh báo trình biên dịch cho các thông báo không xác định.

Để khởi tạo một lớp, bạn chỉ cần giữ đối tượng "Lớp" cho nó. Trong Objective C, tất cả các cá thể của một lớp tham chiếu đến một đối tượng Class (con trỏ isa trong thời gian chạy kế thừa), cũng phản ứng với các phương thức. Nói cách khác, trong đoạn mã sau:

NSArray *myObject = [[NSArray alloc] init]; 

NSArray thực sự là một đối tượng. Vì vậy, đây sẽ tạo ra kết quả mã tương đương:

Class myClass = [NSArray class]; 
NSArray *myObject = [[myClass alloc] init]; 

hoặc thậm chí

Class myClass = NSClassFromString(@"NSArray"); 
NSArray *myObject = [[myClass alloc] init]; 

nào sử dụng hàm NSClassFromString mà bước vào thời gian chạy và tìm thấy một lớp học với tên mà bạn vượt qua trong

All. các đối tượng trả về lớp của chúng nếu sử dụng lớp getter, do đó, để khởi tạo một đối tượng cùng lớp với một đối tượng hiện có như sau:

- (void) leakObjectWithSameClassAs:(id)object { 
    [[[object class] alloc] init]; 
} 
+0

Ha, vâng tôi biết nó không chính xác về cú pháp và lượt xem được ném vào đó. Tôi nên nói rằng ví dụ đó là mã psuedo bastardized. Và bạn đã xoay sở để trả lời câu hỏi của tôi. Cảm ơn bạn –

+0

Bạn phải viết đó là "Class myClass = [NSArray class]". Bạn chỉ có thể sử dụng tên của chính nó khi đó là mục tiêu của một tin nhắn. –

+0

Đó là những gì tôi nhận được để làm việc này vào ban đêm trong một trường văn bản web ;-) –

0

Đây là những gì tôi có bây giờ

- (void)flipfromv1tov2:(UIViewController*)v1:(NSString*)nib1:(UIViewController*)v2{ 

    if(v1 == nil) 
    { 
     UIViewController *newview = [[[v1 class] alloc] initWithNibName:nib1 bundle:nil]; 
     v1 = newview; 
     [newview release]; 
    } 
    [v2.view removeFromSuperview]; 
    [self.view insertSubview:v1.view atIndex:0];  
} 

tôi không thể xác minh đó nhưng vì tôi có một vấn đề liên kết ... Tôi thêm func này để điều khiển gốc của tôi, nhưng vì một lý do tôi nhận được một cảnh báo rằng các chức năng là được khai báo hoàn toàn. Và việc xây dựng không thành công vì cuộc gọi chức năng không bao giờ được liên kết với bất kỳ điều gì

+0

tên hmm func là chuyển tiếp ngược v1 với v2 –

Các vấn đề liên quan