2009-11-23 44 views
5

Tôi đã gặp một vấn đề liên quan đến con trỏ trong mảng trong mục tiêu-c.Thay đổi các giá trị trong NSArray bằng dereferencing?

Những gì tôi đang cố gắng thực hiện là lấy con trỏ trong một NSArray, chuyển chúng vào một phương thức, và sau đó gán giá trị trả lại cho con trỏ ban đầu (con trỏ thuộc về mảng).

Dựa trên những gì tôi biết từ C và C++, bởi dereferencing các con trỏ trong mảng, tôi sẽ có thể thay đổi giá trị mà chúng trỏ đến ... Đây là mã tôi đang sử dụng, nhưng nó không hoạt động (giá trị điện thoại trỏ đến không bao giờ thay đổi dựa trên đầu ra NSLog).

NSArray *phoneNumbers = [phoneEmailDict objectForKey:@"phone"]; 
    for (NSString* phone in phoneNumbers) { 
     (*phone) = (*[self removeNonNumbers:phone]); 
     NSLog(@"phone:%@", phone); 
    } 

Và đây là chữ ký phương pháp tôi đang đi qua các NSString * để:

- (NSString*) removeNonNumbers: (NSString*) string; 

Như bạn thấy, tôi lặp lại qua từng NSString * trong PHONENUMBERS với các điện thoại khác nhau. Tôi vượt qua điện thoại để xóaNonNumbers :, trả về NSString đã sửa đổi *. Sau đó, dereference con trỏ trở về từ removeNonNumber và gán giá trị cho điện thoại.

Như bạn có thể nói, tôi có thể không hiểu đối tượng Objective-C tốt. Tôi khá chắc chắn điều này sẽ làm việc trong C + + hoặc C, nhưng tôi không thể thấy lý do tại sao nó không hoạt động ở đây! Cảm ơn trước sự giúp đỡ của bạn!

Trả lời

13

Vâng, điều đó sẽ không hoạt động. Bạn sẽ cần một số: NSMutableArray:

NSMutableArray * phoneNumbers = [[phoneEmailDict objectForKey:@"phone"] mutableCopy]; 
for (NSUInteger i = 0; i < [phoneNumber count]; ++i) { 
    NSString * phone = [phoneNumbers objectAtIndex:i]; 
    phone = [self removeNonNumbers:phone]; 
    [phoneNumbers replaceObjectAtIndex:i withObject:phone]; 
} 
[phoneEmailDict setObject:phoneNumbers forKey:@"phone"]; 
[phoneNumbers release]; 
2

NSArray không phải là mảng kiểu C/C++. Đó là một đối tượng Objective-C. Bạn cần sử dụng instance methods của lớp NSArray để thực hiện các thao tác trên đó.

Trong mục tiêu-C bạn không bao giờ "dereference" một con trỏ đối tượng để đặt giá trị của nó.

Ngoài ra, bạn đang sử dụng cái được gọi là Fast Enumeration, điều này không cho phép đột biến.

0

Trong khi điều này có thể hoạt động ở mức độ nào đó, tôi chưa thử nghiệm nó, tôi sẽ gửi tệp này dưới 'ý tưởng tồi' và không chạm vào. NSArray và nhiều đối tượng ca cao khác, một đối tượng khá phức tạp và có thể có nhiều triển khai dưới mui xe như là một phần của mẫu thiết kế cụm lớp.

Vì vậy, khi nói đến nó, bạn thực sự sẽ không biết những gì bạn đang làm việc nội bộ. NSArray thực sự được thiết kế để không thay đổi nên việc chỉnh sửa vị trí thậm chí còn gấp đôi một ý tưởng tồi.

Các đối tượng được thiết kế để cho phép bạn gây rối xung quanh với các bộ phận bên trong hiển thị chúng thông qua các phương pháp api như của NSMutableData.

Bạn nên xây dựng một NS mới (Mutable) Array với các giá trị đã xử lý.

4

Bạn không thể dereference Objective-C đối tượng biến. Chúng luôn là con trỏ, nhưng bạn nên đối xử với chúng như thể chúng là giá trị nguyên tử. Bạn cần phải thay đổi chính mảng đó để chứa các đối tượng mới mà bạn đang tạo ra.

1

Bạn cũng có thể sử dụng enumerateObjectsUsingBlock:.

NSArray *array = [NSArray array]; 
__block NSMutableArray *mutableCopyArray = [array mutableCopy]; 
[mutableCopyArray enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) { 
    [mutableCopyArray replaceObjectAtIndex:idx withObject:[object modifiedObject]]; 
}]; 

Thanh toán How do I iterate over an NSArray?

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