2011-08-31 36 views
5

Tôi đang bối rối bởi làm thế nào là biến khai báo trong mục tiêu C.mục tiêu cơ bản C biến khai

1: Tôi thấy @property@synthesize tuyên bố được sử dụng. Câu hỏi của tôi liên quan đến điều đó là gì, câu lệnh 2 này là gì? Tại sao chúng luôn được sử dụng cùng nhau? Tôi đoán @synthesize là một lối tắt để tạo trình khởi động và thiết lập?

2: Giả sử, tôi muốn khai báo NSMutableArray mà chỉ có thể truy cập được bên trong lớp được khai báo. Tôi phải thực hiện myArray = [[NSMutableArray alloc] init] trước khi sử dụng phương thức addObject để viết gì đó cho nó. Khi nào tôi phát hành mảng sau đó?

3: Có cách nào khác để khai báo một biến chỉ truy cập được ở lớp mà nó đã khai báo là có thể truy cập được ở tất cả các lớp không?

4: Tương tự như câu hỏi 2, nhưng bây giờ biến là một NSString. Tại sao tôi không phải phân bổ & init nó để chia sẻ cùng một biến trong lớp riêng của mình? Whats khác nhau giữa self.myString = @""; đến myString = @"";

Cảm ơn rất nhiều.

+0

Khi bạn tham gia vào mục tiêu-c, bạn có thể muốn xem các khóa học Stanford (iTunes). Nó giúp tôi có được đường cong học tập. – nykash

+0

Đây là một câu hỏi rất rộng bao trùm cả nền tảng tốt ở đây trên SO. Hãy nhìn xung quanh. Dưới đây là bốn bài đăng trước giải quyết các câu hỏi của bạn. 1: [Sự khác nhau giữa @property và @synthesize là gì?] (Http: // stackoverflow.com/questions/806379 /) 2: [Khi phát hành một biến cá thể] (http://stackoverflow.com/questions/4063905/) 3: [Làm thế nào để khai báo các biến mẫu không hiển thị bên ngoài cá thể?] (http:/4: [Sự khác biệt giữa self.var vs var] (http://stackoverflow.com/questions/4627646/) Có những người khác về mỗi chủ đề này. –

Trả lời

1

1) @property tuyên bố biến có thể truy cập công khai và trình chuyển đổi liên kết và công cụ đặt. @synthesize làm cho trình biên dịch tự động tạo ra định nghĩa (mã) của trình lấy và thiết lập.

2) Bạn sẽ khai báo NSMutableArray trong khai báo lớp học của bạn, trong tệp tiêu đề. Bạn sẽ khởi tạo biến trong phương thức init và bạn sẽ giải phóng biến trong phương thức dealloc của mình.

3) Các biến được tạo bằng cách sử dụng @property là công khai. Các biến được xác định trong khai báo lớp học của bạn (sử dụng @interface trong tệp tiêu đề) có thể được khai báo là riêng tư cho lớp đó, sử dụng từ khóa @private.

John, những câu hỏi này khá cơ bản. Bạn có lẽ sẽ nhận được rất nhiều trong phần giới thiệu lập trình mục tiêu-C ở đây (http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html#//apple_ref/doc/uid/TP30001163).

+0

'@ property' không khai báo _variable_ có thể truy cập công khai. Bản thân ivar (nếu được tổng hợp) là '@ protected'. Những gì nó tuyên bố là một điểm truy cập cho một số khía cạnh của lớp. Thậm chí không thực sự phải là một biến thể sao lưu nó, miễn là bạn hoàn thành hợp đồng có phương thức getter và setter (hoặc chỉ getter, trong trường hợp 'readonly'). –

+0

Cảm ơn bạn đã làm rõ Josh. –

+1

FWIW, nếu bạn viết riêng của bạn getter và/hoặc setter, một tài sản thậm chí không cần phải có một ivar. Nó cũng chỉ có thể tính toán một cái gì đó, hoặc chuyển đổi từ một mục khác. Ví dụ. một lớp Angle cũng có thể có độ bất động sản như một radian bất động sản. Chỉ radian bất động sản có một ngà ủng hộ, nhưng độ bất động sản (thông qua setter và getter, 'degrees' và' setDegrees: ', tương ứng) chuyển đổi sang và từ radian, phụ thuộc vào hướng. Lớp tệp có thể có thuộc tính fullName sử dụng tên máy chủ, thư mục và tệp để tạo hoặc phân tích tên đầy đủ. –

5

Đối với câu hỏi đầu tiên của bạn:

@property (nonatomic, retain) NSString * someProperty; 

này khai báo một thuộc tính của lớp. Nó trở thành một phần của hợp đồng nào của lớp nhưng vẫn còn thiếu một cái gì đó quan trọng - thực tế thực hiện

@synthesize someProperty; 

Đây là trình biên dịch đường, nó tạo ra một phương thức getter và phương pháp setter cho tài sản của bạn. Để wit, đây là việc thực hiện đó là cần thiết để thực sự sử dụng tài sản của bạn trong lớp học của bạn và từ các lớp khác.

Bạn sẽ ở hầu hết mọi tình huống, luôn có @synthesize cho mỗi @property bạn khai báo.


Đối với câu hỏi thứ hai của bạn:

Bạn là chính xác về cách thức để khởi tạo tài sản mảng của bạn.Để phát hành nó, bạn sẽ làm như sau trong phương pháp dealloc lớp học của bạn:

- (void) dealloc { 
    self.myarray = nil; 

    [super dealloc]; 
} 

này có hiệu quả phát hành mảng (giả sử bạn đã tuyên bố tài sản của bạn với từ khóa giữ).


Và đối với câu hỏi cuối cùng của bạn:

Thuộc tính của một lớp luôn có sẵn từ các lớp khác. Để tạo biến số có thể truy cập toàn cầu, bạn sẽ khai báo là static.

+0

Bạn có thể không có '@ synthesize' cho mọi thuộc tính. Nó cũng có thể là '@ dynamic', hoặc bạn có thể đơn giản khai báo một ivar và thực hiện các phương thức được đặt tên chính xác. –

+0

Tôi đồng ý với điểm đầu tiên của bạn, nhưng điểm thứ hai của bạn không liên quan đến @property và liên quan đến KVC. Đã chỉnh sửa câu trả lời của tôi để phản ánh. – Perception

+1

@Josh: thực sự. Trong một trong các bình luận khác, tôi đưa ra một vài ví dụ khi bạn viết các accessors riêng và thậm chí không có ngà, vì accessors có thể dựa vào các phương tiện khác (truy cập tập tin trực tiếp, cổng, cơ sở dữ liệu, thuật toán, v.v. .) hơn là lấy hoặc đặt trực tiếp ivar. Trong những trường hợp như vậy, bạn không tổng hợp. –

2

Quảng cáo 1: thuộc tính là cấu trúc để kiểm soát quyền truy cập một thanh ngang (thường là riêng tư) bằng getters và setters. Trên thực tế, một tài sản thậm chí không cần phải có một ivar hỗ trợ. Có, @synthesize tạo ra getter và setter (và ivar).

Quảng cáo 2: Bạn phát hành nó khi bạn không cần nữa. Khi điều đó phụ thuộc vào logic của mã của bạn.

Quảng cáo 3: Nếu tôi hiểu chính xác, bạn muốn @private ivars. Thông thường, ivars được bảo vệ, tức là chỉ có thể truy cập trong lớp hoặc trong các lớp dẫn xuất. Các con cá nhân riêng chỉ có thể truy cập bên trong lớp. Thuộc tính có thể truy cập công khai.

Quảng cáo 4: myString = @ "" ghi trực tiếp vào ivar, trong khi self.myString = @ "" sử dụng trình thiết lập thuộc tính.

+0

Tôi thích một dịp mà tôi không thể đọc lại ngà trong lớp. Tôi đã sử dụng 'ivar = something' rồi. Thay đổi nó thành 'self.ivar = something' đã giải quyết được vấn đề. Bạn có thể chia sẻ một số thông tin chi tiết về những gì đã xảy ra không? Tôi đoán ivar đã tự động phát hành như tôi đã đọc lại NULL. Nếu nó giúp, ivar là CLLocation. Tôi không phải thực hiện 'self' đối với các con ngà 'NSString'. – John

+0

Các thuộc tính, nếu được khai báo là (bản sao) hoặc (giữ lại), sẽ giữ lại mục đó (và nhả một mục trước đó), trong khi truy cập trực tiếp ivar thì không có gì thuộc loại đó. Các thuộc tính giúp bạn thực hiện quản lý bộ nhớ, vì trình biên dịch sẽ tạo mã để giữ lại và giải phóng các mục một cách chính xác. Họ vẫn phải được phát hành trong dealloc, tất nhiên. Vì vậy, hãy thử sử dụng thuộc tính ở khắp mọi nơi, ngoại trừ có lẽ trong init và dealloc. –

0

Bạn cần lấy một văn bản trên Objective-C hoặc tìm một hướng dẫn trực tuyến - đó là một ngôn ngữ đầy đủ phức tạp mà bạn không thể hy vọng để nhặt nó lên trong các tờ rơi và buồn tẻ.

Có các biến và có các thuộc tính - hai thứ khác nhau giao nhau một chút.

Bạn có thể tuyên bố đơn giản biến dụ cũ cách tương tự như trong C/C++, nhiều hơn hoặc ít hơn:

NSArray* myArray; 

ví dụ, đặt trong {} phần kín của @ interface.

Nhưng bạn cũng có thể có THUỘC TÍNH, mà bạn tuyên bố bằng cách nói @property trong tuyên bố @interface (sau khi đóng }). Thuộc tính có phương thức getter - theo mặc định được gọi là myProperty - và một phương thức putter - theo mặc định được gọi là setMyProperty. Nếu myProperty có cùng tên với một trong các biến mẫu của bạn thì bạn có thể sử dụng @synthesize để tự động tạo các phương thức này.

Lưu ý rằng các thuộc tính có thể được tự động retain chỉnh sửa khi sử dụng phương thức setter mặc định. Điều này khá thuận tiện trong việc quản lý lưu trữ.

Nhưng việc quản lý lưu trữ là một chủ đề lớn, bạn phải đọc một số hướng dẫn hay - chúng tôi không thể giải thích nó trong một vài đoạn văn.

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